finished the saving process
This commit is contained in:
parent
0a2f45f9b8
commit
64b27f3d05
6 changed files with 97 additions and 544 deletions
64
source/save.py
Normal file
64
source/save.py
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
from io import BytesIO
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
import nextcord
|
||||||
|
import requests
|
||||||
|
from PyQt6.QtCore import pyqtSignal
|
||||||
|
|
||||||
|
result_path = Path("./results/")
|
||||||
|
|
||||||
|
|
||||||
|
def save_all(
|
||||||
|
data: bytes,
|
||||||
|
filename: str,
|
||||||
|
discord_webhook_url: Optional[str] = None,
|
||||||
|
signal_warning: Optional[pyqtSignal] = None
|
||||||
|
):
|
||||||
|
# save to a file
|
||||||
|
save_file(data, filename)
|
||||||
|
|
||||||
|
# upload to a discord webhook
|
||||||
|
if discord_webhook_url is not None:
|
||||||
|
upload_discord(data, discord_webhook_url, filename, signal_warning)
|
||||||
|
|
||||||
|
|
||||||
|
def save_file(
|
||||||
|
data: bytes,
|
||||||
|
filename: str
|
||||||
|
) -> None:
|
||||||
|
"""
|
||||||
|
Save the result data to a file
|
||||||
|
"""
|
||||||
|
|
||||||
|
result_path.mkdir(parents=True, exist_ok=True)
|
||||||
|
(result_path / filename).write_bytes(data)
|
||||||
|
|
||||||
|
|
||||||
|
def upload_discord(
|
||||||
|
data: bytes,
|
||||||
|
discord_webhook_url: str,
|
||||||
|
filename: str,
|
||||||
|
signal_warning: Optional[pyqtSignal] = None
|
||||||
|
) -> None:
|
||||||
|
"""
|
||||||
|
Upload the result to a discord webhook
|
||||||
|
"""
|
||||||
|
|
||||||
|
# create a session
|
||||||
|
with requests.Session() as session:
|
||||||
|
# load the configured webhook
|
||||||
|
webhook = nextcord.SyncWebhook.from_url(discord_webhook_url, session=session)
|
||||||
|
|
||||||
|
try:
|
||||||
|
# send the message to discord
|
||||||
|
message = webhook.send(
|
||||||
|
file=nextcord.File(fp=BytesIO(data), filename=filename),
|
||||||
|
wait=True
|
||||||
|
)
|
||||||
|
|
||||||
|
except Exception as exc:
|
||||||
|
if signal_warning is not None:
|
||||||
|
signal_warning.emit("COULD NOT UPLOAD THE DATA") # NOQA: emit exist
|
||||||
|
else:
|
||||||
|
raise exc
|
|
@ -1,100 +0,0 @@
|
||||||
import typing
|
|
||||||
import uuid
|
|
||||||
from io import BytesIO
|
|
||||||
from pathlib import Path
|
|
||||||
from typing import Optional
|
|
||||||
|
|
||||||
import nextcord
|
|
||||||
import requests
|
|
||||||
from PyQt6.QtCore import Qt, QThread
|
|
||||||
from PyQt6.QtGui import QFont
|
|
||||||
from PyQt6.QtWidgets import QWidget, QProgressBar, QVBoxLayout, QLabel, QMessageBox
|
|
||||||
|
|
||||||
from source import widget
|
|
||||||
from source.utils.compress import compress_data
|
|
||||||
|
|
||||||
|
|
||||||
result_path = Path("./results/")
|
|
||||||
|
|
||||||
|
|
||||||
class SavingScreen(QWidget):
|
|
||||||
def __init__(
|
|
||||||
self,
|
|
||||||
collected_datas: dict,
|
|
||||||
discord_webhook_url: Optional[str] = None
|
|
||||||
):
|
|
||||||
super().__init__()
|
|
||||||
|
|
||||||
self.compressed_collected_datas = compress_data(collected_datas)
|
|
||||||
self.discord_webhook_url = discord_webhook_url
|
|
||||||
|
|
||||||
# layout
|
|
||||||
self._layout = QVBoxLayout()
|
|
||||||
self.setLayout(self._layout)
|
|
||||||
|
|
||||||
# prepare the title
|
|
||||||
self.label_title = QLabel()
|
|
||||||
self._layout.addWidget(self.label_title)
|
|
||||||
self.label_title.setText(self.tr("UPLOADING DATA"))
|
|
||||||
self.label_title.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
|
||||||
|
|
||||||
font_title = self.label_title.font()
|
|
||||||
font_title.setPointSize(24)
|
|
||||||
font_title.setWeight(QFont.Weight.Bold)
|
|
||||||
self.label_title.setFont(font_title)
|
|
||||||
|
|
||||||
# progress
|
|
||||||
self.progress = QProgressBar()
|
|
||||||
self._layout.addWidget(self.progress)
|
|
||||||
|
|
||||||
# prepare the filename
|
|
||||||
filename: str = f"{uuid.uuid4()}.rsl"
|
|
||||||
|
|
||||||
# start a thread for the saving
|
|
||||||
thread = QThread()
|
|
||||||
thread.started.connect(lambda: self.save(filename)) # NOQA: connect exist
|
|
||||||
thread.start()
|
|
||||||
|
|
||||||
def save(self, filename: str):
|
|
||||||
# save to a file
|
|
||||||
self.result_save_file(filename)
|
|
||||||
|
|
||||||
# upload to a discord webhook
|
|
||||||
if self.discord_webhook_url is not None:
|
|
||||||
try:
|
|
||||||
self.result_upload_discord(filename)
|
|
||||||
except nextcord.HTTPException:
|
|
||||||
# if there is an error while uploading, show a graphical warning to the user
|
|
||||||
QMessageBox.warning(
|
|
||||||
self,
|
|
||||||
title=self.tr("WARNING"),
|
|
||||||
text=self.tr("COULD NOT UPLOAD TO DISCORD, SEND MANUALLY"),
|
|
||||||
)
|
|
||||||
|
|
||||||
# quit the application
|
|
||||||
window = typing.cast(widget.SurveyWindow, self.window())
|
|
||||||
window.quit()
|
|
||||||
|
|
||||||
def result_save_file(self, filename: str) -> None:
|
|
||||||
"""
|
|
||||||
Save the result data to a file
|
|
||||||
"""
|
|
||||||
|
|
||||||
result_path.mkdir(parents=True, exist_ok=True)
|
|
||||||
(result_path / filename).write_bytes(self.compressed_collected_datas)
|
|
||||||
|
|
||||||
def result_upload_discord(self, filename: str) -> None:
|
|
||||||
"""
|
|
||||||
Upload the result to a discord webhook
|
|
||||||
"""
|
|
||||||
|
|
||||||
# create a session
|
|
||||||
with requests.Session() as session:
|
|
||||||
# load the configured webhook
|
|
||||||
webhook = nextcord.SyncWebhook.from_url(self.discord_webhook_url, session=session)
|
|
||||||
|
|
||||||
# send the message to discord
|
|
||||||
message = webhook.send(
|
|
||||||
file=nextcord.File(fp=BytesIO(self.compressed_collected_datas), filename=filename),
|
|
||||||
wait=True
|
|
||||||
)
|
|
|
@ -1,15 +1,17 @@
|
||||||
import json
|
import json
|
||||||
import time
|
import time
|
||||||
import typing
|
import typing
|
||||||
|
import uuid
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from PyQt6.QtCore import pyqtSignal
|
from PyQt6.QtCore import pyqtSignal
|
||||||
from PyQt6.QtWidgets import QVBoxLayout, QProgressBar, QWidget
|
from PyQt6.QtWidgets import QVBoxLayout, QProgressBar, QWidget, QMessageBox
|
||||||
|
|
||||||
from source import translate, widget
|
from source import translate, widget, save
|
||||||
from source.survey.base import BaseSurvey
|
from source.survey.base import BaseSurvey
|
||||||
from source.survey import Empty, survey_get
|
from source.survey import Empty, survey_get
|
||||||
|
from source.utils import compress
|
||||||
|
|
||||||
|
|
||||||
class SurveyEngine(QWidget):
|
class SurveyEngine(QWidget):
|
||||||
|
@ -17,6 +19,8 @@ class SurveyEngine(QWidget):
|
||||||
signal_skip = pyqtSignal()
|
signal_skip = pyqtSignal()
|
||||||
signal_success = pyqtSignal()
|
signal_success = pyqtSignal()
|
||||||
|
|
||||||
|
signal_warning = pyqtSignal(str)
|
||||||
|
|
||||||
def __init__(self, surveys_data: dict, discord_webhook_result_url: Optional[str] = None):
|
def __init__(self, surveys_data: dict, discord_webhook_result_url: Optional[str] = None):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
|
@ -35,6 +39,8 @@ class SurveyEngine(QWidget):
|
||||||
self.signal_skip.connect(self._on_signal_skip) # NOQA: connect exist
|
self.signal_skip.connect(self._on_signal_skip) # NOQA: connect exist
|
||||||
self.signal_success.connect(self._on_signal_success) # NOQA: connect exist
|
self.signal_success.connect(self._on_signal_success) # NOQA: connect exist
|
||||||
|
|
||||||
|
self.signal_warning.connect(self._on_signal_warning) # NOQA: connect exist
|
||||||
|
|
||||||
# set the layout
|
# set the layout
|
||||||
self._layout = QVBoxLayout()
|
self._layout = QVBoxLayout()
|
||||||
self.setLayout(self._layout)
|
self.setLayout(self._layout)
|
||||||
|
@ -58,7 +64,7 @@ class SurveyEngine(QWidget):
|
||||||
def from_dict(cls, data: dict) -> "SurveyEngine":
|
def from_dict(cls, data: dict) -> "SurveyEngine":
|
||||||
return cls(
|
return cls(
|
||||||
surveys_data=data["surveys"],
|
surveys_data=data["surveys"],
|
||||||
discord_webhook_result_url=data.get("discord_webhook_result"),
|
discord_webhook_result_url=data.get("discord_webhook_result_url"),
|
||||||
)
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -145,12 +151,29 @@ class SurveyEngine(QWidget):
|
||||||
self.survey.on_ready()
|
self.survey.on_ready()
|
||||||
|
|
||||||
def finish_survey(self):
|
def finish_survey(self):
|
||||||
saving_screen = widget.SavingScreen(
|
# get the filename for the save
|
||||||
self.collected_datas,
|
filename: str = f"{uuid.uuid4()}.rsl"
|
||||||
self.discord_webhook_result_url
|
|
||||||
|
# compress the data
|
||||||
|
compressed_datas = compress.compress_data(self.collected_datas)
|
||||||
|
|
||||||
|
# save them
|
||||||
|
save.save_all(
|
||||||
|
compressed_datas,
|
||||||
|
filename,
|
||||||
|
self.discord_webhook_result_url,
|
||||||
|
signal_warning=self.signal_warning
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# finally, close the window
|
||||||
window = typing.cast(widget.SurveyWindow, self.window())
|
window = typing.cast(widget.SurveyWindow, self.window())
|
||||||
window.setCentralWidget(saving_screen)
|
window.quit()
|
||||||
|
|
||||||
self.deleteLater()
|
# signals
|
||||||
|
|
||||||
|
def _on_signal_warning(self, message: str):
|
||||||
|
QMessageBox.warning(
|
||||||
|
self,
|
||||||
|
self.tr("WARNING"),
|
||||||
|
self.tr(message),
|
||||||
|
)
|
||||||
|
|
|
@ -2,4 +2,3 @@ from .Browser import Browser
|
||||||
from .SurveyEngine import SurveyEngine
|
from .SurveyEngine import SurveyEngine
|
||||||
from .SurveyWindow import SurveyWindow
|
from .SurveyWindow import SurveyWindow
|
||||||
from .SurveyNavigation import SurveyNavigation
|
from .SurveyNavigation import SurveyNavigation
|
||||||
from .SavingScreen import SavingScreen
|
|
||||||
|
|
435
surveys.json
435
surveys.json
|
@ -15,441 +15,8 @@
|
||||||
"fr": "Nous somme des étudiants en Informatique à l'UPJV.\nNous réalisons une étude sur l'ergonomie des interfaces graphique.\nCette étude concerne la plateforme de jeu vidéo \"Steam\".",
|
"fr": "Nous somme des étudiants en Informatique à l'UPJV.\nNous réalisons une étude sur l'ergonomie des interfaces graphique.\nCette étude concerne la plateforme de jeu vidéo \"Steam\".",
|
||||||
"sp": "Somos estudiantes de informática de la UPJV.\nEstamos llevando a cabo un estudio sobre la ergonomía de las interfaces gráficas.\nEste estudio se centra en la plataforma de videojuegos \"Steam\"."
|
"sp": "Somos estudiantes de informática de la UPJV.\nEstamos llevando a cabo un estudio sobre la ergonomía de las interfaces gráficas.\nEste estudio se centra en la plataforma de videojuegos \"Steam\"."
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
|
|
||||||
"text-data-collection": {
|
|
||||||
"type": "text",
|
|
||||||
"title": {
|
|
||||||
"fr": "Collection des données",
|
|
||||||
"en": "Data Collection",
|
|
||||||
"sp": "Recopilación de datos"
|
|
||||||
},
|
|
||||||
"description": {
|
|
||||||
"en": "Our study requires collecting data such as your mouse movements and keyboard input when you navigate within this application.\nNo other data will be collected outside of this application.\nThese data are anonymous and will be exclusively used for our research.\nIf you do not wish to continue with this questionnaire, press \"Exit\"",
|
|
||||||
"fr": "Notre étude demande de collecter des données comme vos mouvements de souris et votre clavier lorsque vous naviguerez sur cette application.\nAucune autre donnée ne sera collecté en dehors de cette application.\nCes données sont anonyme et ne seront destiné exclusivement qu'à notre recherche.\nSi vous ne souhaitez pas continuer ce questionnaire, appuyez sur \"Abandonner\"",
|
|
||||||
"sp": "Nuestro estudio requiere recopilar datos como los movimientos de su ratón y la entrada de su teclado cuando navegue en esta aplicación.\nNo se recopilará ningún otro dato fuera de esta aplicación.\nEstos datos son anónimos y se utilizarán exclusivamente para nuestra investigación.\nSi no desea continuar con este cuestionario, presione \"Salir\"."
|
|
||||||
},
|
|
||||||
"abandonable": true
|
|
||||||
},
|
|
||||||
|
|
||||||
"question-age": {
|
|
||||||
"type": "question-integer",
|
|
||||||
"title": {
|
|
||||||
"en": "What is your age?",
|
|
||||||
"fr": "Quel est votre âge ?",
|
|
||||||
"sp": "¿Cuál es tu edad?"
|
|
||||||
},
|
|
||||||
"default": 30,
|
|
||||||
"minimum": 13,
|
|
||||||
"maximum": 150
|
|
||||||
},
|
|
||||||
|
|
||||||
"question-usage-steam": {
|
|
||||||
"type": "question-single-choice",
|
|
||||||
"title": {
|
|
||||||
"fr": "Utilisez-vous Steam ?",
|
|
||||||
"en": "Do you use Steam?",
|
|
||||||
"sp": "¿Utilizas Steam?"
|
|
||||||
},
|
|
||||||
"choices": {
|
|
||||||
"always": {
|
|
||||||
"text": {
|
|
||||||
"en": "Always",
|
|
||||||
"fr": "Tout le temps",
|
|
||||||
"sp": "Siempre"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"often": {
|
|
||||||
"text": {
|
|
||||||
"en": "Often",
|
|
||||||
"fr": "Souvent",
|
|
||||||
"sp": "A menudo"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"sometime": {
|
|
||||||
"text": {
|
|
||||||
"en": "Sometimes",
|
|
||||||
"fr": "De temps en temps",
|
|
||||||
"sp": "De vez en cuando"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"rarely": {
|
|
||||||
"text": {
|
|
||||||
"en": "Rarely",
|
|
||||||
"fr": "Rarement",
|
|
||||||
"sp": "Raramente"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"never": {
|
|
||||||
"text": {
|
|
||||||
"en": "Never",
|
|
||||||
"fr": "Jamais",
|
|
||||||
"sp": "Nunca"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
"question-usage-concurrent": {
|
|
||||||
"type": "question-multiple-choice",
|
|
||||||
"title": {
|
|
||||||
"en": "Which other online gaming platform do you use?",
|
|
||||||
"fr": "Quel autre plateforme de jeu en ligne utilisez-vous ?",
|
|
||||||
"sp": "¿Qué otra plataforma de juegos en línea utilizas?"
|
|
||||||
},
|
|
||||||
"choices": {
|
|
||||||
"epic": {
|
|
||||||
"text": {
|
|
||||||
"en": "Epic Games Store",
|
|
||||||
"fr": "Epic Games Store",
|
|
||||||
"sp": "Epic Games Store"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"gog": {
|
|
||||||
"text": {
|
|
||||||
"en": "GOG",
|
|
||||||
"fr": "GOG",
|
|
||||||
"sp": "GOG"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"origin": {
|
|
||||||
"text": {
|
|
||||||
"en": "Origin",
|
|
||||||
"fr": "Origin",
|
|
||||||
"sp": "Origin"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"uplay": {
|
|
||||||
"text": {
|
|
||||||
"en": "Uplay",
|
|
||||||
"fr": "Uplay",
|
|
||||||
"sp": "Uplay"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"battle": {
|
|
||||||
"text": {
|
|
||||||
"en": "Battle.net",
|
|
||||||
"fr": "Battle.net",
|
|
||||||
"sp": "Battle.net"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"other": {
|
|
||||||
"text": {
|
|
||||||
"en": "Other",
|
|
||||||
"fr": "Autre",
|
|
||||||
"sp": "Otro"
|
|
||||||
},
|
|
||||||
"ask_details": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
"question-difficulty-before": {
|
|
||||||
"type": "question-single-choice",
|
|
||||||
"title": {
|
|
||||||
"en": "Have you ever encountered any specific difficulties while using Steam?",
|
|
||||||
"fr": "Avez-vous déjà rencontré des difficultés particulières lors de votre utilisation de Steam ?",
|
|
||||||
"sp": "¿Alguna vez has enfrentado alguna dificultad específica al usar Steam?"
|
|
||||||
},
|
|
||||||
"choices": {
|
|
||||||
"no": {
|
|
||||||
"text": {
|
|
||||||
"en": "No",
|
|
||||||
"fr": "Non",
|
|
||||||
"sp": "No"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"yes": {
|
|
||||||
"text": {
|
|
||||||
"en": "Yes",
|
|
||||||
"fr": "Oui",
|
|
||||||
"sp": "Sí"
|
|
||||||
},
|
|
||||||
"ask_details": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
"mission-explanation": {
|
|
||||||
"type": "text",
|
|
||||||
"title": {
|
|
||||||
"en": "Explanation of the Evaluation",
|
|
||||||
"fr": "Explication de l'Evaluation",
|
|
||||||
"sp": "Instrucciones sobre la Evaluación"
|
|
||||||
},
|
|
||||||
"description": {
|
|
||||||
"en": "We will ask you to navigate through Steam.\nA message at the top will indicate a task to be performed on the platform.\n\nIf the task seems too difficult, a button to skip the task will\nappear after a certain time at the bottom right.\n\nReminder: Your keyboard and mouse actions are recorded.\nDo not type any personal information on the following screen!",
|
|
||||||
"fr": "Nous allons vous demander de naviguer dans Steam.\nUn message en haut vous indiquera une tâche à réaliser dans la plateforme.\n\nSi la tâche vous semble trop difficile, un bouton pour passer la tâche\ns'affichera au bout d'un certain temps en bas à droite.\n\nRappel : Votre clavier et votre souris sont enregistré.\nNe tapez aucune information personnel dans l'écran qui va suivre !",
|
|
||||||
"sp": "Le pediremos que navegue por Steam.\nUn mensaje en la parte superior indicará una tarea que debe realizar en la plataforma.\n\nSi la tarea le parece demasiado difícil, aparecerá un botón para omitir la tarea\ndespués de cierto tiempo en la parte inferior derecha.\n\nRecordatorio: Se registran sus acciones de teclado y ratón.\n¡No escriba información personal en la pantalla siguiente!"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
"mission-language": {
|
|
||||||
"type": "mission-web",
|
|
||||||
"title": {
|
|
||||||
"en": "Change the language to English.",
|
|
||||||
"fr": "Changer la langue en Français.",
|
|
||||||
"sp": "Cambiar el idioma a Español."
|
|
||||||
},
|
|
||||||
"url": "https://store.steampowered.com/",
|
|
||||||
"check": "document.getElementsByTagName('html')[0].lang == '#LANGUAGE_CODE#'",
|
|
||||||
"skip_time": 60
|
|
||||||
},
|
|
||||||
|
|
||||||
"mission-price": {
|
|
||||||
"type": "mission-web",
|
|
||||||
"title": {
|
|
||||||
"en": "Display all games costing less than €20.",
|
|
||||||
"fr": "Afficher tous les jeux coutant moins de 20€.",
|
|
||||||
"sp": "Mostrar todos los juegos que cuesten menos de 20€."
|
|
||||||
},
|
|
||||||
"url": "https://store.steampowered.com/",
|
|
||||||
"check": "document.getElementById('maxprice_input').value == '20'",
|
|
||||||
"skip_time": 90
|
|
||||||
},
|
|
||||||
|
|
||||||
"mission-community-hub": {
|
|
||||||
"type": "mission-web",
|
|
||||||
"title": {
|
|
||||||
"en": "Visit the Community Hub for the game \"Stray\".",
|
|
||||||
"fr": "Rendez-vous sur le Hub de la Communauté du jeu \"Stray\".",
|
|
||||||
"sp": "Visita el Hub de la Comunidad del juego \"Stray\"."
|
|
||||||
},
|
|
||||||
"url": "https://store.steampowered.com/",
|
|
||||||
"check": "document.documentURI == 'https://steamcommunity.com/app/1332010'",
|
|
||||||
"skip_time": 90
|
|
||||||
},
|
|
||||||
|
|
||||||
"mission-game-page": {
|
|
||||||
"type": "mission-web",
|
|
||||||
"title": {
|
|
||||||
"en": "Visit the page for the game \"Outer Wilds\".",
|
|
||||||
"fr": "Rendez-vous sur la page du jeu \"Outer Wilds\".",
|
|
||||||
"sp": "Ve a la página del juego \"Outer Wilds\"."
|
|
||||||
},
|
|
||||||
"url": "https://store.steampowered.com/",
|
|
||||||
"check": "document.documentURI == 'https://store.steampowered.com/app/753640/Outer_Wilds/'",
|
|
||||||
"skip_time": 90
|
|
||||||
},
|
|
||||||
|
|
||||||
"mission-game-dlc": {
|
|
||||||
"type": "mission-web",
|
|
||||||
"title": {
|
|
||||||
"en": "Visit the 'Echoes of the Eye' add-on (DLC) page for the game 'Outer Wilds'.",
|
|
||||||
"fr": "Rendez-vous sur la page du contenu additionnel (DLC) \"Echoes of the Eye\" du jeu \"Outer Wilds\".",
|
|
||||||
"sp": "Ve a la página del contenido adicional (DLC) 'Echoes of the Eye' del juego 'Outer Wilds'."
|
|
||||||
},
|
|
||||||
"url": "https://store.steampowered.com/app/753640/Outer_Wilds/",
|
|
||||||
"check": "document.documentURI == 'https://store.steampowered.com/app/1622100/Outer_Wilds__Echoes_of_the_Eye/'",
|
|
||||||
"skip_time": 90
|
|
||||||
},
|
|
||||||
|
|
||||||
"mission-actuality-new": {
|
|
||||||
"type": "mission-web",
|
|
||||||
"title": {
|
|
||||||
"en": "Go to the \"Featured\" News page.",
|
|
||||||
"fr": "Aller sur la page des Actualités \"À la une\".",
|
|
||||||
"sp": "Ir a la página de Noticias \"Destacados\"."
|
|
||||||
},
|
|
||||||
"url": "https://store.steampowered.com/",
|
|
||||||
"check": "document.documentURI == 'https://store.steampowered.com/news/collection/featured/'",
|
|
||||||
"skip_time": 120
|
|
||||||
},
|
|
||||||
|
|
||||||
"mission-profile": {
|
|
||||||
"type": "mission-web",
|
|
||||||
"title": {
|
|
||||||
"en": "Find the profile page of \"Faraphel\".",
|
|
||||||
"fr": "Trouver la page de profil de \"Faraphel\".",
|
|
||||||
"sp": "Encuentra la página de perfil de \"Faraphel\"."
|
|
||||||
},
|
|
||||||
"url": "https://store.steampowered.com/",
|
|
||||||
"check": "document.documentURI == 'https://steamcommunity.com/id/Faraphel'",
|
|
||||||
"skip_time": 240
|
|
||||||
},
|
|
||||||
|
|
||||||
"mission-game-discussion": {
|
|
||||||
"type": "mission-web",
|
|
||||||
"title": {
|
|
||||||
"en": "Find the discussion page for the game \"Sid Meier's Civilization V\".",
|
|
||||||
"fr": "Trouver la page de discussions du jeu \"Sid Meier's Civilization V\".",
|
|
||||||
"sp": "Encuentra la página de discusiones del juego \"Sid Meier's Civilization V\"."
|
|
||||||
},
|
|
||||||
"url": "https://store.steampowered.com/",
|
|
||||||
"check": "document.documentURI == 'https://steamcommunity.com/app/8930/discussions/'",
|
|
||||||
"skip_time": 180
|
|
||||||
},
|
|
||||||
|
|
||||||
"mission-gift-card": {
|
|
||||||
"type": "mission-web",
|
|
||||||
"title": {
|
|
||||||
"en": "Find the Steam gift cards page.",
|
|
||||||
"fr": "Trouver la page des cartes-cadeaux de Steam.",
|
|
||||||
"sp": "Encuentra la página de las tarjetas de regalo de Steam."
|
|
||||||
},
|
|
||||||
"url": "https://store.steampowered.com/",
|
|
||||||
"check": "document.documentURI == 'https://store.steampowered.com/digitalgiftcards'",
|
|
||||||
"skip_time": 240
|
|
||||||
},
|
|
||||||
|
|
||||||
"mission-workshop": {
|
|
||||||
"type": "mission-web",
|
|
||||||
"title": {
|
|
||||||
"en": "Find the community page for the \"Animated Hair\" modification for the game \"Terraria\" on the Workshop.",
|
|
||||||
"fr": "Trouver la page de communauté de la modification \"Animated Hair\" du jeu \"Terraria\" sur le Workshop.",
|
|
||||||
"sp": "Encuentra la página de la comunidad para la modificación \"Animated Hair\" del juego \"Terraria\" en el Workshop."
|
|
||||||
},
|
|
||||||
"url": "https://store.steampowered.com/",
|
|
||||||
"check": "publishedfileid == '2871109853'",
|
|
||||||
"skip_time": 240
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
"question-hardest-mission": {
|
|
||||||
"type": "question-single-choice",
|
|
||||||
"title": {
|
|
||||||
"en": "Among the tasks, which one did you find the most difficult?",
|
|
||||||
"fr": "Parmi les tâches, laquelle avez-vous trouvée la plus difficile ?",
|
|
||||||
"sp": "Entre las tareas que realizaste, ¿cuál es la que encontraste más difícil?"
|
|
||||||
},
|
|
||||||
"choices": {
|
|
||||||
"mission-language": {
|
|
||||||
"text": {
|
|
||||||
"en": "Change the language",
|
|
||||||
"fr": "Changer la langue",
|
|
||||||
"sp": "Cambiar el idioma"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mission-price": {
|
|
||||||
"text": {
|
|
||||||
"en": "Filter games by their price",
|
|
||||||
"fr": "Filtrer les jeux par leur prix",
|
|
||||||
"sp": "Filtrar juegos por su precio"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mission-community-hub": {
|
|
||||||
"text": {
|
|
||||||
"en": "Visit the community hub",
|
|
||||||
"fr": "Se rendre sur le hub de la communauté",
|
|
||||||
"sp": "Ir al hub de la comunidad"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mission-game-page": {
|
|
||||||
"text": {
|
|
||||||
"en": "Visit a game page",
|
|
||||||
"fr": "Se rendre sur la page d'un jeu",
|
|
||||||
"sp": "Visitar la página de un juego"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mission-game-dlc": {
|
|
||||||
"text": {
|
|
||||||
"en": "Visit the downloadable content (DLC) page of a game",
|
|
||||||
"fr": "Se rendre sur la page du contenu additionnel (DLC) d'un jeu",
|
|
||||||
"sp": "Visitar la página del contenido adicional descargable (DLC) de un juego"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mission-actuality-new": {
|
|
||||||
"text": {
|
|
||||||
"en": "Visit the \"Featured\" news page",
|
|
||||||
"fr": "Se rendre sur la page des actualités \"À la une\"",
|
|
||||||
"sp": "Visitar la página de noticias \"Destacadas\""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mission-profile": {
|
|
||||||
"text": {
|
|
||||||
"en": "Visit a user's profile",
|
|
||||||
"fr": "Se rendre sur le profil d'un utilisateur",
|
|
||||||
"sp": "Visitar el perfil de un usuario"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mission-game-discussion": {
|
|
||||||
"text": {
|
|
||||||
"en": "Visit the discussion page of a game",
|
|
||||||
"fr": "Se rendre sur la page de discussion d'un jeu",
|
|
||||||
"sp": "Visitar la página de discusión de un juego"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mission-gift-card": {
|
|
||||||
"text": {
|
|
||||||
"en": "Visit the gift cards page",
|
|
||||||
"fr": "Se rendre sur la page des cartes cadeaux",
|
|
||||||
"sp": "Ir a la página de tarjetas de regalo"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mission-workshop": {
|
|
||||||
"text": {
|
|
||||||
"en": "Visit the modification (mods) page of a game",
|
|
||||||
"fr": "Se rendre sur la page de la modification (mods) d'un jeu",
|
|
||||||
"sp": "Visitar la página de modificación (mods) de un juego"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
"question-experience": {
|
|
||||||
"type": "question-single-choice",
|
|
||||||
"title": {
|
|
||||||
"en": "Did you find the Steam interface ergonomic?",
|
|
||||||
"fr": "Avez-vous trouvé l'interface de Steam ergonomique ?",
|
|
||||||
"sp": "¿Consideras que la interfaz de Steam es ergonómica?"
|
|
||||||
},
|
|
||||||
"choices": {
|
|
||||||
"yes": {
|
|
||||||
"text": {
|
|
||||||
"en": "Yes",
|
|
||||||
"fr": "Oui",
|
|
||||||
"sp": "Sí"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mixed": {
|
|
||||||
"text": {
|
|
||||||
"en": "Partially",
|
|
||||||
"fr": "Mitigé",
|
|
||||||
"sp": "Parcialmente"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"no": {
|
|
||||||
"text": {
|
|
||||||
"en": "No",
|
|
||||||
"fr": "Non",
|
|
||||||
"sp": "No"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
"question-experience-details": {
|
|
||||||
"type": "question-text",
|
|
||||||
"title": {
|
|
||||||
"en": "What did you think of the Steam interface?",
|
|
||||||
"fr": "Qu'avez-vous pensé de l'ergonomie de Steam ?",
|
|
||||||
"sp": "¿Qué opinas sobre la ergonomía de Steam?"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
"question-comment": {
|
|
||||||
"type": "question-text",
|
|
||||||
"title": {
|
|
||||||
"en": "You can leave a comment about your overall experience (optional)",
|
|
||||||
"fr": "Vous pouvez laisser un commentaire sur votre ressenti général (optionnel)",
|
|
||||||
"sp": "Puedes dejar un comentario sobre tu experiencia general (opcional)"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
"text-thanking": {
|
|
||||||
"type": "text",
|
|
||||||
"title": {
|
|
||||||
"en": "Acknowledgments",
|
|
||||||
"fr": "Remerciements",
|
|
||||||
"sp": "Agradecimientos"
|
|
||||||
},
|
|
||||||
"description": {
|
|
||||||
"en": "We greatly appreciate your contribution to our survey and your time.",
|
|
||||||
"fr": "Nous vous remercions grandement pour votre contribution à notre questionnaire et pour votre temps.",
|
|
||||||
"sp": "Agradecemos enormemente su contribución a nuestro cuestionario y su tiempo."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue