diff --git a/.gitignore b/.gitignore index 1e03ae1..b1acd62 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ __pycache__ src/.wvenv/ src/.venv/ -src/dota_notes/data/sqlite.db +src/dota_notes/data/models/sqlite.db src/build src/dist diff --git a/src/Makefile b/src/Makefile index 670eb38..caa22fb 100644 --- a/src/Makefile +++ b/src/Makefile @@ -54,13 +54,13 @@ unix-clean: # Generate UI from Qt Designer files unix-gen-ui: - ./.venv/Scripts/pyside6-uic ./d2notes/ui/ui_main_window.ui -o ./d2notes/ui/ui_main_window.py --absolute-imports -python-paths . + ./.venv/bin/pyside6-uic ./d2notes/ui/ui_main_window.ui -o ./d2notes/ui/ui_main_window.py --absolute-imports -python-paths . # Generate embedded resources from Qt resource file unix-gen-resources: - ./.venv/Scripts/pyside6-rcc ./d2notes/ui/resources.qrc -o ./d2notes/ui/resources_rc.py + ./.venv/bin/pyside6-rcc ./d2notes/ui/resources.qrc -o ./d2notes/ui/resources_rc.py ## Generate a production build unix-build: - ./.venv/Script/pyinstaller --noconfirm ./DotaNotes.spec + ./.venv/bin/pyinstaller --noconfirm ./DotaNotes.spec diff --git a/src/dota_notes/app_dota.py b/src/dota_notes/app_dota.py deleted file mode 100644 index c61c2f5..0000000 --- a/src/dota_notes/app_dota.py +++ /dev/null @@ -1,78 +0,0 @@ -from steam.client import SteamClient -from dota2.client import Dota2Client -from dota2.msg import EDOTAGCMsg - -from dota_notes.data.messages import MessageServerIdResponse, MessageConnectionStatus, MessageServerIdRequest, \ - MessageConnect - - -def dota_process(username, password, match_id_in_queue, server_id_out_queue): - """Dota client spawner""" - app = DotaApp(username, password, match_id_in_queue, server_id_out_queue) - app.run() - - -class DotaApp: - """Dota client processing jobs requested by the Qt process. - - Args: - user: Steam username - password: Steam password - message_queue_dota: Queue to receive jobs - message_queue_qt: Queue to send job results - """ - - def __init__(self, user, password, message_queue_dota, message_queue_qt): - self.user = user - self.password = password - self.message_queue_dota = message_queue_dota - self.message_queue_qt = message_queue_qt - self.message_buffer_queue = [] - - self.steam = SteamClient() - self.dota = Dota2Client(self.steam) - self.dota_ready = False - self.match_id = 0 - self.keep_running = True - - self.steam.on('logged_on', self.on_logged_on) - self.dota.on('ready', self.do_dota_stuff) - self.dota.on('disconnected', self.on_disconnect) - self.dota.on(EDOTAGCMsg.EMsgGCSpectateFriendGameResponse, self.on_spectate_response) - - def on_logged_on(self): - self.message_queue_qt.put(MessageConnectionStatus("On", "Try")) - self.dota.launch() - - def do_dota_stuff(self): - self.message_queue_qt.put(MessageConnectionStatus("On", "On")) - self.dota_ready = True - - def on_disconnect(self): - self.message_queue_qt.put(MessageConnectionStatus("Off", "Off")) - - def on_spectate_response(self, response): - self.message_queue_qt.put(MessageServerIdResponse(response.server_steamid)) - - def connect(self): - self.message_queue_qt.put(MessageConnectionStatus("Try", "Off")) - self.steam.login(username=self.user, password=self.password) - - def run(self): - while self.keep_running: - if not self.message_queue_dota.empty(): - message = self.message_queue_dota.get(block=False) - if isinstance(message, MessageConnect): - self.user = message.user - self.password = message.password - self.connect() - else: - self.message_buffer_queue.append(message) - if self.dota_ready and len(self.message_buffer_queue) > 0: - message = self.message_buffer_queue.pop(0) - if isinstance(message, MessageServerIdRequest): - self.dota.send(EDOTAGCMsg.EMsgGCSpectateFriendGame, {'steam_id': int(message.account_id)}) - self.steam.sleep(1) - - def stop(self): - self.keep_running = False diff --git a/src/dota_notes/app_flask.py b/src/dota_notes/app_flask.py index eab8d3f..842851f 100644 --- a/src/dota_notes/app_flask.py +++ b/src/dota_notes/app_flask.py @@ -1,9 +1,11 @@ from flask import Flask, request, jsonify +from dota_notes.data.messages import MessageGSI -def flask_process(port, match_info_queue): + +def flask_process(port, message_queue_qt): """Flask app spawner""" - flask_app = FlaskApp(port, match_info_queue) + flask_app = FlaskApp(port, message_queue_qt) flask_app.run() @@ -12,36 +14,24 @@ class FlaskApp: Args: port: port to listen to - match_info_queue: Queue to transmit the match information + message_queue_qt: Queue to transmit the match information to the qt app """ - def __init__(self, port, match_info_queue): + def __init__(self, port, message_queue_qt): self.app = Flask(__name__) self.port = port - self.match_info_queue = match_info_queue + self.message_queue_qt = message_queue_qt self.last_match_id_sent = 0 @self.app.route('/', methods=['POST']) def gsi_endpoint(): payload = request.get_json() - if ('map' in payload and "matchid" in payload["map"] and - "player" in payload and - "team2" in payload["player"] and - len(payload["player"]["team2"]) > 1): - info = { - "match_id": int(payload["map"]["matchid"]), - "players": []} - if self.last_match_id_sent == info["match_id"] or info["match_id"] == 0: + if 'map' in payload and "matchid" in payload["map"] and payload["map"]["matchid"] is not None: + info = MessageGSI(int(payload["map"]["matchid"])) + if self.last_match_id_sent == info.match_id or info.match_id == 0: return jsonify({}) - else: - self.last_match_id_sent = info["match_id"] - - for team in payload["player"].values(): - for player in team.values(): - if "accountid" not in player or "name" not in player: - continue - info["players"].append({"accountid": int(player["accountid"]), "name": player["name"]}) - self.match_info_queue.put(info) + self.last_match_id_sent = info.match_id + self.message_queue_qt.put(info) return jsonify({}) def run(self): diff --git a/src/dota_notes/data/messages.py b/src/dota_notes/data/messages.py index 7a0d892..1850f11 100644 --- a/src/dota_notes/data/messages.py +++ b/src/dota_notes/data/messages.py @@ -1,44 +1,6 @@ -class MessageConnect: - """Ask the client to connect with specific credentials +class MessageGSI: + """MatchId send by the GSI""" + match_id: str - Attributes: - user: steam username - password: steam password - """ - user: str - password: str - - def __init__(self, user: str, password: str): - self.user = user - self.password = password - - -class MessageConnectionStatus: - """Report the status of the connections of steam/dota clients - - Attributes: - steam: Steam connection status - dota: Dota connection status - """ - steam: str - dota: str - - def __init__(self, steam: str, dota: str): - self.steam = steam - self.dota = dota - - -class MessageServerIdRequest: - """Request the server ID a specific account is playing on""" - account_id: str - - def __init__(self, account_id: str): - self.account_id = account_id - - -class MessageServerIdResponse: - """Server ID where a specific player is playing on""" - server_id: int - - def __init__(self, server_id: int): - self.server_id = server_id + def __init__(self, match_id): + self.match_id = match_id diff --git a/src/dota_notes/data/models/__init__.py b/src/dota_notes/data/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/dota_notes/data/models/base_entity.py b/src/dota_notes/data/models/base_entity.py new file mode 100644 index 0000000..34fad37 --- /dev/null +++ b/src/dota_notes/data/models/base_entity.py @@ -0,0 +1,6 @@ +from sqlalchemy.orm import DeclarativeBase + + +class BaseEntity(DeclarativeBase): + """Database model base class""" + pass diff --git a/src/dota_notes/data/models/database.py b/src/dota_notes/data/models/database.py new file mode 100644 index 0000000..2b567b1 --- /dev/null +++ b/src/dota_notes/data/models/database.py @@ -0,0 +1,41 @@ +import os +import sys + +from sqlalchemy import create_engine +from sqlalchemy.orm import Session + +from dota_notes.data.models.base_entity import BaseEntity +from dota_notes.data.models.settings_entity import SettingEntity + + +class Database: + """Singleton defining database URI and unique ressources. + + Attributes: + _instance: Singleton instance + uri: database location + engine: database connection used for session generation + """ + + _instance = None + + def __new__(cls, *args, **kwargs): + """New overload to create a singleton.""" + if not isinstance(cls._instance, cls): + cls._instance = object.__new__(cls) + return cls._instance + + def __init__(self): + """Defines all necessary ressources (URI & engine) and create database if necessary.""" + if getattr(sys, 'frozen', False): + file_uri = os.path.dirname(sys.executable) + elif __file__: + file_uri = os.path.dirname(__file__) + self.uri = f"sqlite+pysqlite:///{file_uri}/sqlite.db" + self.engine = create_engine(self.uri, echo=False) + BaseEntity.metadata.create_all(self.engine) + + with Session(self.engine) as session: + if session.get(SettingEntity, "version") is None: + session.add(SettingEntity("version", "1")) + session.commit() diff --git a/src/dota_notes/data/models.py b/src/dota_notes/data/models/player_entity.py similarity index 59% rename from src/dota_notes/data/models.py rename to src/dota_notes/data/models/player_entity.py index b1c7024..22bfc5d 100644 --- a/src/dota_notes/data/models.py +++ b/src/dota_notes/data/models/player_entity.py @@ -1,67 +1,9 @@ -import os -import sys from typing import Optional -from sqlalchemy import create_engine, String -from sqlalchemy.orm import Session, DeclarativeBase, mapped_column, Mapped +from sqlalchemy import String +from sqlalchemy.orm import Mapped, mapped_column - -class Database(object): - """Singleton defining database URI and unique ressources. - - Attributes: - _instance: Singleton instance - uri: database location - engine: database connection used for session generation - """ - - _instance = None - - def __new__(cls, *args, **kwargs): - """New overload to create a singleton.""" - if not isinstance(cls._instance, cls): - cls._instance = object.__new__(cls) - return cls._instance - - def __init__(self): - """Defines all necessary ressources (URI & engine) and create database if necessary.""" - if getattr(sys, 'frozen', False): - file_uri = os.path.dirname(sys.executable) - elif __file__: - file_uri = os.path.dirname(__file__) - self.uri = 'sqlite+pysqlite:///{0}/sqlite.db'.format(file_uri) - self.engine = create_engine(self.uri, echo=False) - BaseEntity.metadata.create_all(self.engine) - - with Session(self.engine) as session: - if session.get(SettingEntity, "version") is None: - session.add(SettingEntity("version", "1")) - session.commit() - - -class BaseEntity(DeclarativeBase): - """Database model base class""" - pass - - -class SettingEntity(BaseEntity): - """An application setting. - - Attributes: - key: unique string defining a setting - value: value of the setting - """ - __tablename__ = 'settings' - - key: Mapped[str] = mapped_column(primary_key=True) - value: Mapped[str] = mapped_column() - - def __init__(self, key, value): - self.key = key - self.value = value - - def __repr__(self) -> str: - return f"Setting(key={self.key!r}, value={self.value!r})" +from dota_notes.data.models.base_entity import BaseEntity class PlayerEntity(BaseEntity): @@ -72,7 +14,9 @@ class PlayerEntity(BaseEntity): name: last seen name pro_name: pro name (if fetched from the API) custom_name: user set name + match_count: number of games played by the user (set by stratz) smurf: user defined smurf indicator + smurf_stratz: smurf flag (set by stratz) is_racist: flag is_sexist: flag is_toxic: flag @@ -87,7 +31,9 @@ class PlayerEntity(BaseEntity): name: Mapped[str] = mapped_column() pro_name: Mapped[Optional[str]] = mapped_column() custom_name: Mapped[str] = mapped_column() + match_count: Mapped[Optional[int]] = mapped_column() smurf: Mapped[str] = mapped_column() + smurf_stratz: Mapped[Optional[int]] = mapped_column() is_racist: Mapped[bool] = mapped_column() is_sexist: Mapped[bool] = mapped_column() is_toxic: Mapped[bool] = mapped_column() @@ -96,13 +42,16 @@ class PlayerEntity(BaseEntity): destroys_items: Mapped[bool] = mapped_column() note: Mapped[str] = mapped_column(String(500)) - def __init__(self, steam_id, name, pro_name=None, custom_name="", smurf="", is_racist=False, is_sexist=False, - is_toxic=False, is_feeder=False, gives_up=False, destroys_items=False, note=""): + def __init__(self, steam_id, name, pro_name=None, custom_name="", match_count=None, smurf="", smurf_stratz=None, + is_racist=False, is_sexist=False, is_toxic=False, is_feeder=False, gives_up=False, + destroys_items=False, note=""): self.steam_id = steam_id self.name = name self.pro_name = pro_name self.custom_name = custom_name + self.match_count = match_count self.smurf = smurf + self.smurf_stratz = smurf_stratz self.is_racist = is_racist self.is_sexist = is_sexist self.is_toxic = is_toxic @@ -123,7 +72,9 @@ def make_from_state(player_state): player_state.name, player_state.pro_name if player_state.pro_name != "" else None, player_state.custom_name, + player_state.match_count, player_state.smurf, + player_state.smurf_stratz, player_state.is_racist, player_state.is_sexist, player_state.is_toxic, @@ -141,7 +92,9 @@ def import_export(from_object, to_object): """ to_object.pro_name = from_object.pro_name to_object.custom_name = from_object.custom_name + to_object.match_count = from_object.match_count to_object.smurf = from_object.smurf + to_object.smurf_stratz = from_object.smurf_stratz to_object.is_racist = from_object.is_racist to_object.is_sexist = from_object.is_sexist to_object.is_toxic = from_object.is_toxic diff --git a/src/dota_notes/data/models/settings_entity.py b/src/dota_notes/data/models/settings_entity.py new file mode 100644 index 0000000..d12338c --- /dev/null +++ b/src/dota_notes/data/models/settings_entity.py @@ -0,0 +1,23 @@ +from sqlalchemy.orm import Mapped, mapped_column + +from dota_notes.data.models.base_entity import BaseEntity + + +class SettingEntity(BaseEntity): + """An application setting. + + Attributes: + key: unique string defining a setting + value: value of the setting + """ + __tablename__ = 'settings' + + key: Mapped[str] = mapped_column(primary_key=True) + value: Mapped[str] = mapped_column() + + def __init__(self, key, value): + self.key = key + self.value = value + + def __repr__(self) -> str: + return f"Setting(key={self.key!r}, value={self.value!r})" diff --git a/src/dota_notes/data/settings.py b/src/dota_notes/data/settings.py index d29cf82..5912fe7 100644 --- a/src/dota_notes/data/settings.py +++ b/src/dota_notes/data/settings.py @@ -1,4 +1,4 @@ -from dota_notes.data.models import SettingEntity +from dota_notes.data.models.settings_entity import SettingEntity class Settings(object): @@ -7,27 +7,14 @@ class Settings(object): Attributes: _instance: Singleton instance gsi_port: Port used by the http server awaiting request from GSI - gsi_spectate: flag to enable gsi spectate or not - software_mode: Mode the software works into - proxy_url: URL to do requests at when using "Proxy" mode - proxy_api_key: Key to use in "Proxy" mode - steam_user: Steam username in "Client" mode - steam_password: Steam password in "Client" mode - steam_api_key: Steam WEB API key in "Client" mode + stratz_token: ... """ _instance = None gsi_port: int = 58765 - gsi_spectate: bool = False - software_mode: str = "Client" - proxy_url: str = "https://dota-notes.the-cluster.org" - proxy_api_key: str = "" - steam_user: str = "" - steam_password: str = "" - steam_api_key: str = "" + stratz_token: str = "" - TO_IMPORT_EXPORT = ["gsi_port", "gsi_spectate", "software_mode", "proxy_url", "proxy_api_key", "steam_user", - "steam_password", "steam_api_key"] + TO_IMPORT_EXPORT = ["gsi_port", "stratz_token"] def __new__(cls, *args, **kwargs): """New overload to create a singleton.""" diff --git a/src/dota_notes/data/states.py b/src/dota_notes/data/states.py deleted file mode 100644 index 4f88be0..0000000 --- a/src/dota_notes/data/states.py +++ /dev/null @@ -1,145 +0,0 @@ -from PySide6.QtCore import QObject - -from dota_notes.data.models import PlayerEntity - - -class GameState(QObject): - """In memory information about a game - - Attributes: - match_id: unique identifier of a match - server_id: unique identifier of the server the match is played on - players: list of all the player in the game - """ - match_id = 0 - server_id = 0 - players = [] - - def __init__(self): - super().__init__() - self.fresh_players() - - def fresh_players(self): - """Clean the list of players. - - Returns - Set (steam_id -> PlayerState) of players before the cleaning - """ - old_player_state = {} - for player in self.players: - old_player_state[player.steam_id] = player - self.players = [ - PlayerState(), PlayerState(), PlayerState(), PlayerState(), PlayerState(), - PlayerState(), PlayerState(), PlayerState(), PlayerState(), PlayerState(), - ] - return old_player_state - - def enrich_with_database(self, session): - """Fetch the database information about players and update the state with them - - Args: - session: database session - """ - for player in self.players: - if player.steam_id == 0: - continue - player_db = session.get(PlayerEntity, str(player.steam_id)) - if player_db is not None: - PlayerEntity.import_export(player_db, player) - - def enrich_with_old_player_state(self, old_player_state): - """Enrich with the data from an old state - - Args: - old_player_state: information about players of another game - """ - for player in self.players: - if player.steam_id in old_player_state: - for at in PlayerState.ATTRIBUTES_TO_COPY: - setattr(player, at, getattr(old_player_state[player.steam_id], at)) - - def update_with_gsi(self, json): - """Update with information from the GameStateIntegration (spectate only) - - Args: - json: GSI information - """ - if "match_id" in json: - self.match_id = int(json["match_id"]) - else: - self.match_id = 0 - self.server_id = 0 - - old_player_state = self.fresh_players() - for index, player in enumerate(json["players"]): - self.players[index].steam_id = player["accountid"] - self.players[index].name = player["name"] - self.enrich_with_old_player_state(old_player_state) - - def update_with_live_game(self, json): - """Update with information of a live game (Steam Web API) - - Args: - json: Web API return info - """ - if "match" in json: - if "server_steam_id" in json["match"]: - self.server_id = int(json["match"]["server_steam_id"]) - if "match_id" in json["match"]: - self.match_id = int(json["match"]["match_id"]) - - old_player_state = self.fresh_players() - if "teams" in json and isinstance(json["teams"], list): - for team in json["teams"]: - if "players" in team and isinstance(team["players"], list): - for player in team["players"]: - if "playerid" in player: - if "accountid" in player: - self.players[player["playerid"]].steam_id = player["accountid"] - if "name" in player: - self.players[player["playerid"]].name = player["name"] - self.enrich_with_old_player_state(old_player_state) - - def update_with_last_game(self, json): - """Use the OpenDota last game information to populate the state. - - Args: - json: Data from OpenDota API - """ - if "match_id" in json: - self.match_id = int(json["match_id"]) - else: - self.match_id = 0 - self.server_id = 0 - - old_player_state = self.fresh_players() - if "players" in json and isinstance(json["players"], list): - for index, player in enumerate(json["players"]): - if "account_id" in player: - if player["account_id"] is None: - self.players[index].steam_id = 0 - self.players[index].name = "< HIDDEN ACCOUNT >" - else: - self.players[index].steam_id = int(player["account_id"]) - if "personaname" in player: - self.players[index].name = player["personaname"] - self.enrich_with_old_player_state(old_player_state) - - -class PlayerState(QObject): - """In memory information about a player. Attributes similar to the PlayerEntity""" - steam_id = 0 - name = "" - pro_name = None - custom_name = "" - smurf = "" - is_racist = False - is_sexist = False - is_toxic = False - is_feeder = False - gives_up = False - destroys_items = False - note = "" - - ATTRIBUTES_TO_COPY = ["steam_id", "pro_name", "custom_name", "smurf", "is_racist", "is_sexist", "is_toxic", - "is_feeder", "gives_up", "destroys_items", "note"] diff --git a/src/dota_notes/data/states/__init__.py b/src/dota_notes/data/states/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/dota_notes/data/states/game_state.py b/src/dota_notes/data/states/game_state.py new file mode 100644 index 0000000..421b250 --- /dev/null +++ b/src/dota_notes/data/states/game_state.py @@ -0,0 +1,131 @@ +from PySide6.QtCore import QObject + +from dota_notes.data.messages import MessageGSI +from dota_notes.data.models.player_entity import PlayerEntity +from dota_notes.data.states.player_state import PlayerState + + +class GameState(QObject): + """In memory information about a game + + Attributes: + match_id: unique identifier of a match + players: list of all the player in the game + """ + last_gsi_match_id = 0 + match_id = 0 + players = [] + + def __init__(self): + super().__init__() + self.fresh_players() + + def fresh_players(self): + """Clean the list of players. + + Returns + Set (steam_id -> PlayerState) of players before the cleaning + """ + old_player_state = {} + for player in self.players: + old_player_state[player.steam_id] = player + self.players = [ + PlayerState(), PlayerState(), PlayerState(), PlayerState(), PlayerState(), + PlayerState(), PlayerState(), PlayerState(), PlayerState(), PlayerState(), + ] + return old_player_state + + def enrich_players_with_database(self, session): + """Fetch the database information about players and update the state with them + + Args: + session: database session + """ + for player in self.players: + if player.steam_id == 0: + continue + player_db = session.get(PlayerEntity, str(player.steam_id)) + if player_db is not None: + PlayerEntity.import_export(player_db, player) + + def enrich_players_with_old_player_state(self, old_player_state): + """Enrich with the data from an old state + + Args: + old_player_state: information about players of another game + """ + for player in self.players: + if player.steam_id in old_player_state: + player.copy_from(old_player_state[player.steam_id]) + + def update_with_live_game(self, json): + """Update with information of a live game (Steam Web API) + + Args: + json: Web API return info + """ + self.match_id = 0 + old_player_state = self.fresh_players() + if ("data" not in json + or "live" not in json["data"] + or "match" not in json["data"]["live"]): + return + + match_json = json["data"]["live"]["match"] + if "matchId" in match_json and match_json["matchId"] is not None: + self.match_id = match_json["matchId"] + if "players" not in match_json or not isinstance(match_json["players"], list): + return + + for index, player in enumerate(match_json["players"]): + if "steamAccount" in player and player["steamAccount"] is not None: + account = player["steamAccount"] + self.players[index].enrich_with_stratz_account_info(account) + self.enrich_players_with_old_player_state(old_player_state) + + def update_with_last_game(self, json): + """Use the Stratz last game information to populate the state. + + Args: + json: Data from OpenDota API + """ + self.match_id = 0 + old_player_state = self.fresh_players() + + if ("data" not in json + or "player" not in json["data"] + or "matches" not in json["data"]["player"] + or not isinstance(json["data"]["player"]["matches"], list) + or len(json["data"]["player"]["matches"]) == 0): + return + + match_json = json["data"]["player"]["matches"][0] + if "id" in match_json and match_json["id"] is not None: + self.match_id = match_json["id"] + if "players" not in match_json or not isinstance(match_json["players"], list): + return + + for index, player in enumerate(match_json["players"]): + if "steamAccount" in player and player["steamAccount"] is not None: + account = player["steamAccount"] + self.players[index].enrich_with_stratz_account_info(account) + self.enrich_players_with_old_player_state(old_player_state) + + def enrich_players_with_stratz_info(self, json): + """Enrich the state by importing player info from a stratz json + + Args + json: json returned by stratz API + """ + if "data" not in json: + return + + for player in self.players: + if f"p{player.steam_id}" in json["data"]: + extra_info = json["data"][f"p{player.steam_id}"] + + if "matchCount" in extra_info and extra_info["matchCount"] is not None: + player.match_count = extra_info["matchCount"] + if "steamAccount" in extra_info and extra_info["steamAccount"] is not None: + account = extra_info["steamAccount"] + player.enrich_with_stratz_account_info(account) diff --git a/src/dota_notes/data/states/player_state.py b/src/dota_notes/data/states/player_state.py new file mode 100644 index 0000000..bb66c48 --- /dev/null +++ b/src/dota_notes/data/states/player_state.py @@ -0,0 +1,62 @@ +from PySide6.QtCore import QObject + + +class PlayerState(QObject): + """In memory information about a player. Attributes similar to the PlayerEntity""" + steam_id = 0 + avatar = "" + account_level = None + country_code = "" + name = "" + pro_name = None + custom_name = "" + match_count = None + smurf = "" + smurf_stratz = None + is_racist = False + is_sexist = False + is_toxic = False + is_feeder = False + gives_up = False + destroys_items = False + note = "" + + ATTRIBUTES_FOR_COPY = ["steam_id", "avatar", "account_level", "country_code", + "pro_name", "custom_name", "match_count", "smurf", "smurf_stratz", + "is_racist", + "is_sexist", "is_toxic", "is_feeder", "gives_up", "destroys_items", "note"] + + def copy_from(self, from_object): + """Copy attributes from another object into this + + Args: + from_object: source of the copy + """ + for at in self.ATTRIBUTES_FOR_COPY: + setattr(self, at, getattr(from_object, at)) + + def enrich_with_stratz_account_info(self, account): + """Enrich the state using Stratz json information + + Args + account: steamAccount json return from Stratz + """ + if "id" in account and account["id"] is not None: + self.steam_id = account["id"] + if "avatar" in account and account["avatar"] is not None: + self.avatar = account["avatar"] + if "dotaAccountLevel" in account and account["dotaAccountLevel"] is not None: + self.account_level = account["dotaAccountLevel"] + if "smurfFlag" in account and account["smurfFlag"] is not None: + self.smurf_stratz = account["smurfFlag"] + if "countryCode" in account and account["countryCode"] is not None: + self.country_code = account["countryCode"] + if "name" in account and account["name"] is not None: + self.name = account["name"] + else: + self.name = "< HIDDEN ACCOUNT >" + + if "proSteamAccount" in account and account["proSteamAccount"] is not None: + pro_steam_account = account["proSteamAccount"] + if "name" in pro_steam_account and pro_steam_account["name"] is not None: + self.pro_name = pro_steam_account["name"] diff --git a/src/dota_notes/dota_notes.py b/src/dota_notes/dota_notes.py index 2ff0f06..6482319 100644 --- a/src/dota_notes/dota_notes.py +++ b/src/dota_notes/dota_notes.py @@ -1,10 +1,9 @@ import multiprocessing import sys -from dota_notes.data.states import GameState -from dota_notes.data.models import Database +from dota_notes.data.states.game_state import GameState +from dota_notes.data.models.database import Database from dota_notes.app_flask import flask_process -from dota_notes.app_dota import dota_process from dota_notes.data.settings import Settings from dota_notes.ui.app_qt import QtApp @@ -21,10 +20,8 @@ class DotaNotes: settings: settings database: database connection state: in-memory data state - message_queue_dota: queue to send message to the dota process message_queue_qt: queue to send message to the qt process app_flask: Web server process listening to GSI - app_dota: Dota client process app_qt: Qt process """ def __init__(self): @@ -36,23 +33,16 @@ def __init__(self): session.commit() self.match_information_from_gsi = multiprocessing.Queue() - self.message_queue_dota = multiprocessing.Queue() self.message_queue_qt = multiprocessing.Queue() self.app_flask = multiprocessing.Process(target=flask_process, args=(self.settings.gsi_port, - self.match_information_from_gsi,)) - self.app_dota = multiprocessing.Process( - target=dota_process, - args=(self.settings.steam_user, self.settings.steam_password, self.message_queue_dota, - self.message_queue_qt,)) + self.message_queue_qt,)) self.app_qt = QtApp(self) def run(self): """Run the software""" self.app_flask.start() - self.app_dota.start() return_code = self.app_qt.run() self.app_flask.kill() - self.app_dota.kill() sys.exit(return_code) diff --git a/src/dota_notes/helpers.py b/src/dota_notes/helpers.py index c33b583..d27e894 100644 --- a/src/dota_notes/helpers.py +++ b/src/dota_notes/helpers.py @@ -3,49 +3,386 @@ from urllib3 import Retry -def get_live_game_stats(api_key, server_id): - """Fetch game live information using the WEB API and knowing the server the game is played on. +def exec_stratz_graphql_query(token: str, query: str): + """Execute a graphql query on stratz endpoint. Args: - api_key: str Steam WEB API key - server_id: int Server ID where the match is played + token: Stratz auth bearer token + query: query to execute """ + if token == "": + return None + try: s = requests.Session() - retries = Retry(total=8, backoff_jitter=1, status_forcelist=[400]) + retries = Retry(total=8, backoff_jitter=1, status_forcelist=[400, 403]) s.mount("https://", HTTPAdapter(max_retries=retries)) - url = f"https://api.steampowered.com/IDOTA2MatchStats_570/GetRealtimeStats/v1/?key={api_key}&server_steam_id={str(server_id)}" - response = s.get(url) + url = "https://api.stratz.com/graphql" + response = s.get(url, headers={"Authorization": f"Bearer {token}"}, params={"query": query}) response.raise_for_status() - return response.json() except requests.exceptions.RequestException as e: - print(f"Error occurred while fetching data: {e}") + print(f"Error occurred while executing stratz query: {e}") return None -def get_last_game_stats(account_id): - """Fetch the last game played by an account using Opendota. +def stratz_get_players_info(token: str, players: list[int]): + """Request the information for target players using Stratz API Args: - account_id: player to fetch the information about + token: Stratz auth bearer token + players: list of players to fetch + Returns + json of the http response or None if error """ + if len(players) == 0: + return None + player_queries = "" + for player in players: + player_queries = player_queries + f"p{player}:player(steamAccountId: {player}){{ ...playerProfile }}" + full_query = f"""fragment playerProfile on PlayerType {{ + steamAccountId + matchCount + steamAccount {{ + avatar + name + dotaAccountLevel + smurfFlag + countryCode + proSteamAccount{{ + name + position + }} + }} + }} + {{ + {player_queries} + }}""" + return exec_stratz_graphql_query(token, full_query) - try: - s = requests.Session() - retries = Retry(total=8, backoff_jitter=1, status_forcelist=[400]) - s.mount("https://", HTTPAdapter(max_retries=retries)) - url1 = f"https://api.opendota.com/api/players/{account_id}/matches?limit=1" - response = s.get(url1) - response.raise_for_status() - match_list = response.json() - if len(match_list) == 0: - return None - game_id = match_list[0]["match_id"] - url2 = f"https://api.opendota.com/api/matches/{game_id}" - response = s.get(url2) - response.raise_for_status() - return response.json() - except requests.exceptions.RequestException as e: - print(f"Error occurred while fetching opendota data: {e}") + +def stratz_get_last_game(token: str, player: int): + """Request the last game played by someone using Stratz + + Args: + token: Stratz auth bearer token + player: 32bit steam ID + Returns + json of the http response or None if error + """ + if player == 0: return None + query = f"""{{ + player(steamAccountId: {player}){{ + steamAccountId + matches(request: {{ + orderBy: DESC + take: 1 + }}) {{ + id + players {{ + steamAccount {{ + id + avatar + name + dotaAccountLevel + smurfFlag + countryCode + proSteamAccount {{ + name + position + }} + }} + }} + }} + }} + }}""" + return exec_stratz_graphql_query(token, query) + + +def stratz_get_live_game(token: str, match_id: int): + """Request the info of a live game using Stratz + + Args: + token: Stratz auth bearer token + match_id: live game match id + Returns + json of the http response or None if error + """ + if match_id == 0: + return None + query = f"""{{ + live {{ + match(id: {match_id}) {{ + matchId + players {{ + steamAccount {{ + id + avatar + dotaAccountLevel + smurfFlag + proSteamAccount {{ + name + position + }} + countryCode + name + }} + }} + }} + }} + }}""" + return exec_stratz_graphql_query(token, query) + + +ISO_3166_COUNTRIES = { + "AF": "Afghanistan", + "AX": "Åland Islands", + "AL": "Albania", + "DZ": "Algeria", + "AS": "American Samoa", + "AD": "Andorra", + "AO": "Angola", + "AI": "Anguilla", + "AQ": "Antarctica", + "AG": "Antigua and Barbuda", + "AR": "Argentina", + "AM": "Armenia", + "AW": "Aruba", + "AU": "Australia", + "AT": "Austria", + "AZ": "Azerbaijan", + "BS": "Bahamas", + "BH": "Bahrain", + "BD": "Bangladesh", + "BB": "Barbados", + "BY": "Belarus", + "BE": "Belgium", + "BZ": "Belize", + "BJ": "Benin", + "BM": "Bermuda", + "BT": "Bhutan", + "BO": "Bolivia", + "BQ": "Bonaire, Sint Eustatius and Saba", + "BA": "Bosnia and Herzegovina", + "BW": "Botswana", + "BV": "Bouvet Island", + "BR": "Brazil", + "IO": "British Indian Ocean Territory", + "BN": "Brunei Darussalam", + "BG": "Bulgaria", + "BF": "Burkina Faso", + "BI": "Burundi", + "CV": "Cabo Verde", + "KH": "Cambodia", + "CM": "Cameroon", + "CA": "Canada", + "KY": "Cayman Islands", + "CF": "Central African Republic", + "TD": "Chad", + "CL": "Chile", + "CN": "China", + "CX": "Christmas Island", + "CC": "Cocos Islands", + "CO": "Colombia", + "KM": "Comoros", + "CG": "Congo", + "CD": "Congo, Democratic Republic of the", + "CK": "Cook Islands", + "CR": "Costa Rica", + "CI": "Côte d'Ivoire", + "HR": "Croatia", + "CU": "Cuba", + "CW": "Curaçao", + "CY": "Cyprus", + "CZ": "Czech Republic", + "DK": "Denmark", + "DJ": "Djibouti", + "DM": "Dominica", + "DO": "Dominican Republic", + "EC": "Ecuador", + "EG": "Egypt", + "SV": "El Salvador", + "GQ": "Equatorial Guinea", + "ER": "Eritrea", + "EE": "Estonia", + "SZ": "Eswatini", + "ET": "Ethiopia", + "FK": "Falkland Islands", + "FO": "Faroe Islands", + "FJ": "Fiji", + "FI": "Finland", + "FR": "France", + "GF": "French Guiana", + "PF": "French Polynesia", + "TF": "French Southern Territories", + "GA": "Gabon", + "GM": "Gambia", + "GE": "Georgia", + "DE": "Germany", + "GH": "Ghana", + "GI": "Gibraltar", + "GR": "Greece", + "GL": "Greenland", + "GD": "Grenada", + "GP": "Guadeloupe", + "GU": "Guam", + "GT": "Guatemala", + "GG": "Guernsey", + "GN": "Guinea", + "GW": "Guinea-Bissau", + "GY": "Guyana", + "HT": "Haiti", + "HM": "Heard Island and McDonald Islands", + "VA": "Holy See", + "HN": "Honduras", + "HK": "Hong Kong", + "HU": "Hungary", + "IS": "Iceland", + "IN": "India", + "ID": "Indonesia", + "IR": "Iran", + "IQ": "Iraq", + "IE": "Ireland", + "IM": "Isle of Man", + "IL": "Israel", + "IT": "Italy", + "JM": "Jamaica", + "JP": "Japan", + "JE": "Jersey", + "JO": "Jordan", + "KZ": "Kazakhstan", + "KE": "Kenya", + "KI": "Kiribati", + "KP": "Korea, Democratic People's Republic of", + "KR": "Korea, Republic of", + "KW": "Kuwait", + "KG": "Kyrgyzstan", + "LA": "Lao People's Democratic Republic", + "LV": "Latvia", + "LB": "Lebanon", + "LS": "Lesotho", + "LR": "Liberia", + "LY": "Libya", + "LI": "Liechtenstein", + "LT": "Lithuania", + "LU": "Luxembourg", + "MO": "Macao", + "MG": "Madagascar", + "MW": "Malawi", + "MY": "Malaysia", + "MV": "Maldives", + "ML": "Mali", + "MT": "Malta", + "MH": "Marshall Islands", + "MQ": "Martinique", + "MR": "Mauritania", + "MU": "Mauritius", + "YT": "Mayotte", + "MX": "Mexico", + "FM": "Micronesia", + "MD": "Moldova", + "MC": "Monaco", + "MN": "Mongolia", + "ME": "Montenegro", + "MS": "Montserrat", + "MA": "Morocco", + "MZ": "Mozambique", + "MM": "Myanmar", + "NA": "Namibia", + "NR": "Nauru", + "NP": "Nepal", + "NL": "Netherlands", + "NC": "New Caledonia", + "NZ": "New Zealand", + "NI": "Nicaragua", + "NE": "Niger", + "NG": "Nigeria", + "NU": "Niue", + "NF": "Norfolk Island", + "MK": "North Macedonia", + "MP": "Northern Mariana Islands", + "NO": "Norway", + "OM": "Oman", + "PK": "Pakistan", + "PW": "Palau", + "PS": "Palestine", + "PA": "Panama", + "PG": "Papua New Guinea", + "PY": "Paraguay", + "PE": "Peru", + "PH": "Philippines", + "PN": "Pitcairn", + "PL": "Poland", + "PT": "Portugal", + "PR": "Puerto Rico", + "QA": "Qatar", + "RE": "Réunion", + "RO": "Romania", + "RU": "Russian Federation", + "RW": "Rwanda", + "BL": "Saint Barthélemy", + "SH": "Saint Helena", + "KN": "Saint Kitts and Nevis", + "LC": "Saint Lucia", + "MF": "Saint Martin", + "PM": "Saint Pierre and Miquelon", + "VC": "Saint Vincent and the Grenadines", + "WS": "Samoa", + "SM": "San Marino", + "ST": "Sao Tome and Principe", + "SA": "Saudi Arabia", + "SN": "Senegal", + "RS": "Serbia", + "SC": "Seychelles", + "SL": "Sierra Leone", + "SG": "Singapore", + "SX": "Sint Maarten", + "SK": "Slovakia", + "SI": "Slovenia", + "SB": "Solomon Islands", + "SO": "Somalia", + "ZA": "South Africa", + "GS": "South Georgia and the South Sandwich Islands", + "SS": "South Sudan", + "ES": "Spain", + "LK": "Sri Lanka", + "SD": "Sudan", + "SR": "Suriname", + "SJ": "Svalbard and Jan Mayen", + "SE": "Sweden", + "CH": "Switzerland", + "SY": "Syrian Arab Republic", + "TW": "Taiwan", + "TJ": "Tajikistan", + "TZ": "Tanzania", + "TH": "Thailand", + "TL": "Timor-Leste", + "TG": "Togo", + "TK": "Tokelau", + "TO": "Tonga", + "TT": "Trinidad and Tobago", + "TN": "Tunisia", + "TR": "Turkey", + "TM": "Turkmenistan", + "TC": "Turks and Caicos Islands", + "TV": "Tuvalu", + "UG": "Uganda", + "UA": "Ukraine", + "AE": "United Arab Emirates", + "GB": "United Kingdom", + "US": "United States", + "UM": "United States Minor Outlying Islands", + "UY": "Uruguay", + "UZ": "Uzbekistan", + "VU": "Vanuatu", + "VE": "Venezuela", + "VN": "Vietnam", + "VG": "Virgin Islands, British", + "VI": "Virgin Islands, U.S.", + "WF": "Wallis and Futuna", + "EH": "Western Sahara", + "YE": "Yemen", + "ZM": "Zambia", + "ZW": "Zimbabwe" +} diff --git a/src/dota_notes/ui/app_qt.py b/src/dota_notes/ui/app_qt.py index e89341e..81b1063 100644 --- a/src/dota_notes/ui/app_qt.py +++ b/src/dota_notes/ui/app_qt.py @@ -5,12 +5,11 @@ from sqlalchemy.orm import Session -from dota_notes.data.models import SettingEntity, PlayerEntity -from dota_notes.data.messages import MessageServerIdResponse, MessageConnectionStatus, MessageServerIdRequest, \ - MessageConnect -from dota_notes.helpers import get_live_game_stats, get_last_game_stats +from dota_notes.data.models.settings_entity import SettingEntity +from dota_notes.data.models.player_entity import PlayerEntity +from dota_notes.data.messages import MessageGSI +from dota_notes.helpers import stratz_get_players_info, stratz_get_last_game, stratz_get_live_game from dota_notes.ui.main_window import MainWindow -from steam.steamid import SteamID class QtApp: @@ -29,17 +28,21 @@ def __init__(self, dota_notes): self.window.actionExit.triggered.connect(self.window.close) self.window.buttonSettingsSave.clicked.connect(self.on_settings_save) self.window.buttonSettingsCancel.clicked.connect(self.on_settings_cancel) - self.window.buttonConnect.clicked.connect(self.on_connect_client) - self.window.buttonBububu.clicked.connect(lambda: self.window.inputSteamId.setText("76561198066647717")) - self.window.buttonBulldog.clicked.connect(lambda: self.window.inputSteamId.setText("76561198053098358")) - self.window.buttonGrubby.clicked.connect(lambda: self.window.inputSteamId.setText("76561198809738927")) - self.window.buttonPhilaeux.clicked.connect(lambda: self.window.inputSteamId.setText("76561197961298382")) - self.window.buttonS4.clicked.connect(lambda: self.window.inputSteamId.setText("76561198001497299")) + self.window.buttonBububu.clicked.connect(lambda: self.window.inputSteamId.setText("106381989")) + self.window.buttonBulldog.clicked.connect(lambda: self.window.inputSteamId.setText("92832630")) + self.window.buttonGrubby.clicked.connect(lambda: self.window.inputSteamId.setText("849473199")) + self.window.buttonPhilaeux.clicked.connect(lambda: self.window.inputSteamId.setText("1032654")) + self.window.buttonS4.clicked.connect(lambda: self.window.inputSteamId.setText("41231571")) self.window.buttonSearchLive.clicked.connect(self.on_search_live_game) self.window.buttonSearchLast.clicked.connect(self.on_search_last_game) + self.window.buttonStratz.clicked.connect(self.on_stratz_profiles_search) self.window.buttonDetailsSave.clicked.connect(self.on_save_player_details) for i in range(10): getattr(self.window, f"labelPlayer{i}Name").clicked.connect(self.on_label_click) + getattr(self.window, f"labelPlayer{i}CustomName").clicked.connect(self.on_label_click) + getattr(self.window, f"labelPlayer{i}ProName").clicked.connect(self.on_label_click) + getattr(self.window, f"labelPlayer{i}GameCount").clicked.connect(self.on_label_click) + getattr(self.window, f"labelPlayer{i}Smurf").clicked.connect(self.on_label_click) with Session(self.dota_notes.database.engine) as session: last_search = session.get(SettingEntity, "last_search") @@ -56,106 +59,69 @@ def run(self): return return_code def process_queues(self): - while not self.dota_notes.match_information_from_gsi.empty(): - match_info = self.dota_notes.match_information_from_gsi.get(block=False) - if self.dota_notes.state.match_id != match_info["match_id"] and self.dota_notes.settings.gsi_spectate: - self.dota_notes.state.update_with_gsi(match_info) - with Session(self.dota_notes.database.engine) as session: - self.dota_notes.state.enrich_with_database(session) - self.window.draw_status_message(f"Detected match {self.dota_notes.state.match_id} from GSI.") - self.window.draw_match_with_state(self.dota_notes.state) - self.draw_details_with_player(0) while not self.dota_notes.message_queue_qt.empty(): message = self.dota_notes.message_queue_qt.get(block=False) - if isinstance(message, MessageServerIdResponse): - if message.server_id != 0: - self.dota_notes.state.server_id = message.server_id - game_json = get_live_game_stats(self.dota_notes.settings.steam_api_key, self.dota_notes.state.server_id) - self.dota_notes.state.update_with_live_game(game_json) - with Session(self.dota_notes.database.engine) as session: - self.dota_notes.state.enrich_with_database(session) - self.window.draw_status_message(f"Found game info for player {self.window.inputSteamId.text()} using WEBAPI.") - self.window.draw_match_with_state(self.dota_notes.state) - self.draw_details_with_player(0) - else: - self.window.draw_status_message("No game found for player " + self.window.inputSteamId.text()) - elif isinstance(message, MessageConnectionStatus): - self.window.draw_connection_status(message.steam, message.dota) + if isinstance(message, MessageGSI): + self.dota_notes.state.last_gsi_match_id = message.match_id + self.window.draw_match_with_state(self.dota_notes.state) def on_open_settings(self): settings = self.dota_notes.settings - self.window.comboBoxSettingsMode.setCurrentText(settings.software_mode) - self.window.checkBoxGSI.setChecked(settings.gsi_spectate) - self.window.lineEditSettingsProxyURL.setText(settings.proxy_url) - self.window.lineEditSettingsProxyAPIKey.setText(settings.proxy_api_key) - self.window.lineEditSettingsSteamUser.setText(settings.steam_user) - self.window.lineEditSettingsSteamPassword.setText(settings.steam_password) - self.window.lineEditSettingsSteamAPIKey.setText(settings.steam_api_key) + self.window.lineEditStratzToken.setText(settings.stratz_token) self.window.centralStackedWidget.setCurrentIndex(1) def on_settings_save(self): settings = self.dota_notes.settings - settings.software_mode = self.window.comboBoxSettingsMode.currentText() - settings.gsi_spectate = self.window.checkBoxGSI.isChecked() - settings.proxy_url = self.window.lineEditSettingsProxyURL.text() - settings.proxy_api_key = self.window.lineEditSettingsProxyAPIKey.text() - settings.steam_user = self.window.lineEditSettingsSteamUser.text() - settings.steam_password = self.window.lineEditSettingsSteamPassword.text() - settings.steam_api_key = self.window.lineEditSettingsSteamAPIKey.text() + settings.stratz_token = self.window.lineEditStratzToken.text() with Session(self.dota_notes.database.engine) as session: settings.export_to_database(session) + session.commit() self.window.centralStackedWidget.setCurrentIndex(0) def on_settings_cancel(self): self.window.centralStackedWidget.setCurrentIndex(0) - def on_connect_client(self): - self.window.buttonConnect.setVisible(False) - message = MessageConnect(self.dota_notes.settings.steam_user, self.dota_notes.settings.steam_password) - self.dota_notes.message_queue_dota.put(message) - def on_label_click(self, label_name, label_text): row = 0 for char in label_name: if char.isdigit(): row = int(char) - self.draw_details_with_player(row) + self.on_select_player(row) - def draw_details_with_player(self, player_slot): + def on_select_player(self, player_slot): self.lastIndexSelected = player_slot - player_state = self.dota_notes.state.players[player_slot] - self.window.labelDetailsSteamId.setText(str(player_state.steam_id)) - self.window.labelDetailsName.setText(player_state.name) - self.window.labelDetailsProName.setText( - player_state.pro_name if player_state.pro_name is not None else "") - self.window.inputDetailsCustomName.setText(player_state.custom_name) - self.window.comboBoxDetailsSmurf.setCurrentText(player_state.smurf) - self.window.checkBoxDetailsRacist.setChecked(player_state.is_racist) - self.window.checkBoxDetailsSexist.setChecked(player_state.is_sexist) - self.window.checkBoxDetailsToxic.setChecked(player_state.is_toxic) - self.window.checkBoxDetailsFeeder.setChecked(player_state.is_feeder) - self.window.checkBoxDetailsGivesUp.setChecked(player_state.gives_up) - self.window.checkBoxDetailsDestroysItems.setChecked(player_state.destroys_items) - self.window.inputDetailsNote.setPlainText(player_state.note) + self.window.draw_details_with_player(player_state) def on_search_live_game(self): """Get current game info for a player (if any)""" - steam_id = self.window.inputSteamId.text() - if self.is_valid_search(steam_id): - self.dota_notes.message_queue_dota.put(MessageServerIdRequest(steam_id)) + if self.dota_notes.state.last_gsi_match_id == 0: + return + json = stratz_get_live_game(self.dota_notes.settings.stratz_token, self.dota_notes.state.last_gsi_match_id) + if json is not None: + self.dota_notes.state.update_with_live_game(json) + with Session(self.dota_notes.database.engine) as session: + self.dota_notes.state.enrich_players_with_database(session) + self.window.draw_match_with_state(self.dota_notes.state) + self.on_select_player(0) + self.window.draw_status_message("Found live game and updated UI") + else: + self.window.draw_status_message("No live game info to draw") def on_search_last_game(self): """Get last game info for a player (if public)""" + if self.dota_notes.settings.stratz_token == "": + return steam_id = self.window.inputSteamId.text() if self.is_valid_search(steam_id): - steam_id = SteamID(steam_id) - json = get_last_game_stats(steam_id.as_32) + json = stratz_get_last_game(self.dota_notes.settings.stratz_token, steam_id) if json is not None: self.dota_notes.state.update_with_last_game(json) - self.window.draw_status_message("Found last game and updated UI") + with Session(self.dota_notes.database.engine) as session: + self.dota_notes.state.enrich_players_with_database(session) self.window.draw_match_with_state(self.dota_notes.state) - self.draw_details_with_player(0) + self.on_select_player(0) + self.window.draw_status_message("Found last game and updated UI") else: self.window.draw_status_message("No last game found for specified user") @@ -178,10 +144,23 @@ def is_valid_search(self, steam_id): session.commit() return True + def on_stratz_profiles_search(self): + """Use Stratz to look for player info (smurfs, games, pro names)""" + if self.dota_notes.settings.stratz_token == "": + return + to_fetch = [] + for player in self.dota_notes.state.players: + if player.steam_id != 0: + to_fetch.append(player.steam_id) + json = stratz_get_players_info(self.dota_notes.settings.stratz_token, to_fetch) + if json is not None: + self.dota_notes.state.enrich_players_with_stratz_info(json) + self.window.draw_match_with_state(self.dota_notes.state) + self.on_select_player(self.lastIndexSelected) + self.window.draw_status_message("Updated player with stratz info.") + def on_save_player_details(self): player_state = self.dota_notes.state.players[self.lastIndexSelected] - player_state.pro_name = \ - self.window.labelDetailsProName.text() if self.window.labelDetailsProName != "" else None player_state.custom_name = self.window.inputDetailsCustomName.text() player_state.smurf = self.window.comboBoxDetailsSmurf.currentText() player_state.is_racist = self.window.checkBoxDetailsRacist.isChecked() diff --git a/src/dota_notes/ui/fonts/Roboto-Medium.ttf b/src/dota_notes/ui/fonts/Roboto-Medium.ttf new file mode 100644 index 0000000..ac0f908 Binary files /dev/null and b/src/dota_notes/ui/fonts/Roboto-Medium.ttf differ diff --git a/src/dota_notes/ui/images/description.svg b/src/dota_notes/ui/images/description.svg new file mode 100644 index 0000000..8f9446a --- /dev/null +++ b/src/dota_notes/ui/images/description.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/dota_notes/ui/images/download.svg b/src/dota_notes/ui/images/download.svg new file mode 100644 index 0000000..c4ec1c3 --- /dev/null +++ b/src/dota_notes/ui/images/download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/dota_notes/ui/images/flags/ac.svg b/src/dota_notes/ui/images/flags/ac.svg new file mode 100644 index 0000000..1a6d508 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ac.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ad.svg b/src/dota_notes/ui/images/flags/ad.svg new file mode 100644 index 0000000..3793d99 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ad.svg @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ae.svg b/src/dota_notes/ui/images/flags/ae.svg new file mode 100644 index 0000000..b7acdbd --- /dev/null +++ b/src/dota_notes/ui/images/flags/ae.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/af.svg b/src/dota_notes/ui/images/flags/af.svg new file mode 100644 index 0000000..417dd04 --- /dev/null +++ b/src/dota_notes/ui/images/flags/af.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ag.svg b/src/dota_notes/ui/images/flags/ag.svg new file mode 100644 index 0000000..250b501 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ag.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ai.svg b/src/dota_notes/ui/images/flags/ai.svg new file mode 100644 index 0000000..502fcb6 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ai.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/al.svg b/src/dota_notes/ui/images/flags/al.svg new file mode 100644 index 0000000..b69ae19 --- /dev/null +++ b/src/dota_notes/ui/images/flags/al.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/am.svg b/src/dota_notes/ui/images/flags/am.svg new file mode 100644 index 0000000..99fa4dc --- /dev/null +++ b/src/dota_notes/ui/images/flags/am.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/ao.svg b/src/dota_notes/ui/images/flags/ao.svg new file mode 100644 index 0000000..4dc39f6 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ao.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/aq.svg b/src/dota_notes/ui/images/flags/aq.svg new file mode 100644 index 0000000..53840cc --- /dev/null +++ b/src/dota_notes/ui/images/flags/aq.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/ar.svg b/src/dota_notes/ui/images/flags/ar.svg new file mode 100644 index 0000000..364fca8 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ar.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/arab.svg b/src/dota_notes/ui/images/flags/arab.svg new file mode 100644 index 0000000..c45e3d2 --- /dev/null +++ b/src/dota_notes/ui/images/flags/arab.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/as.svg b/src/dota_notes/ui/images/flags/as.svg new file mode 100644 index 0000000..b974013 --- /dev/null +++ b/src/dota_notes/ui/images/flags/as.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/at.svg b/src/dota_notes/ui/images/flags/at.svg new file mode 100644 index 0000000..c282508 --- /dev/null +++ b/src/dota_notes/ui/images/flags/at.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/au.svg b/src/dota_notes/ui/images/flags/au.svg new file mode 100644 index 0000000..407fef4 --- /dev/null +++ b/src/dota_notes/ui/images/flags/au.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/aw.svg b/src/dota_notes/ui/images/flags/aw.svg new file mode 100644 index 0000000..32cabd5 --- /dev/null +++ b/src/dota_notes/ui/images/flags/aw.svg @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ax.svg b/src/dota_notes/ui/images/flags/ax.svg new file mode 100644 index 0000000..0584d71 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ax.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/az.svg b/src/dota_notes/ui/images/flags/az.svg new file mode 100644 index 0000000..8e56ef5 --- /dev/null +++ b/src/dota_notes/ui/images/flags/az.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ba.svg b/src/dota_notes/ui/images/flags/ba.svg new file mode 100644 index 0000000..fcd1891 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ba.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bb.svg b/src/dota_notes/ui/images/flags/bb.svg new file mode 100644 index 0000000..263bdec --- /dev/null +++ b/src/dota_notes/ui/images/flags/bb.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/bd.svg b/src/dota_notes/ui/images/flags/bd.svg new file mode 100644 index 0000000..16b794d --- /dev/null +++ b/src/dota_notes/ui/images/flags/bd.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/dota_notes/ui/images/flags/be.svg b/src/dota_notes/ui/images/flags/be.svg new file mode 100644 index 0000000..327f28f --- /dev/null +++ b/src/dota_notes/ui/images/flags/be.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bf.svg b/src/dota_notes/ui/images/flags/bf.svg new file mode 100644 index 0000000..4713822 --- /dev/null +++ b/src/dota_notes/ui/images/flags/bf.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bg.svg b/src/dota_notes/ui/images/flags/bg.svg new file mode 100644 index 0000000..b100dd0 --- /dev/null +++ b/src/dota_notes/ui/images/flags/bg.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bh.svg b/src/dota_notes/ui/images/flags/bh.svg new file mode 100644 index 0000000..7a2ea54 --- /dev/null +++ b/src/dota_notes/ui/images/flags/bh.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/dota_notes/ui/images/flags/bi.svg b/src/dota_notes/ui/images/flags/bi.svg new file mode 100644 index 0000000..1050838 --- /dev/null +++ b/src/dota_notes/ui/images/flags/bi.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bj.svg b/src/dota_notes/ui/images/flags/bj.svg new file mode 100644 index 0000000..0846724 --- /dev/null +++ b/src/dota_notes/ui/images/flags/bj.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bl.svg b/src/dota_notes/ui/images/flags/bl.svg new file mode 100644 index 0000000..819afc1 --- /dev/null +++ b/src/dota_notes/ui/images/flags/bl.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/bm.svg b/src/dota_notes/ui/images/flags/bm.svg new file mode 100644 index 0000000..a4dbc72 --- /dev/null +++ b/src/dota_notes/ui/images/flags/bm.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bn.svg b/src/dota_notes/ui/images/flags/bn.svg new file mode 100644 index 0000000..f906abf --- /dev/null +++ b/src/dota_notes/ui/images/flags/bn.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bo.svg b/src/dota_notes/ui/images/flags/bo.svg new file mode 100644 index 0000000..17a0a0c --- /dev/null +++ b/src/dota_notes/ui/images/flags/bo.svg @@ -0,0 +1,676 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bq.svg b/src/dota_notes/ui/images/flags/bq.svg new file mode 100644 index 0000000..0e6bc76 --- /dev/null +++ b/src/dota_notes/ui/images/flags/bq.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/br.svg b/src/dota_notes/ui/images/flags/br.svg new file mode 100644 index 0000000..354a701 --- /dev/null +++ b/src/dota_notes/ui/images/flags/br.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bs.svg b/src/dota_notes/ui/images/flags/bs.svg new file mode 100644 index 0000000..513be43 --- /dev/null +++ b/src/dota_notes/ui/images/flags/bs.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bt.svg b/src/dota_notes/ui/images/flags/bt.svg new file mode 100644 index 0000000..cea6006 --- /dev/null +++ b/src/dota_notes/ui/images/flags/bt.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bv.svg b/src/dota_notes/ui/images/flags/bv.svg new file mode 100644 index 0000000..40e16d9 --- /dev/null +++ b/src/dota_notes/ui/images/flags/bv.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bw.svg b/src/dota_notes/ui/images/flags/bw.svg new file mode 100644 index 0000000..a1c8db0 --- /dev/null +++ b/src/dota_notes/ui/images/flags/bw.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/by.svg b/src/dota_notes/ui/images/flags/by.svg new file mode 100644 index 0000000..8d25ee3 --- /dev/null +++ b/src/dota_notes/ui/images/flags/by.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bz.svg b/src/dota_notes/ui/images/flags/bz.svg new file mode 100644 index 0000000..08d3579 --- /dev/null +++ b/src/dota_notes/ui/images/flags/bz.svg @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ca.svg b/src/dota_notes/ui/images/flags/ca.svg new file mode 100644 index 0000000..f1b2c96 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ca.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/dota_notes/ui/images/flags/cc.svg b/src/dota_notes/ui/images/flags/cc.svg new file mode 100644 index 0000000..93025bd --- /dev/null +++ b/src/dota_notes/ui/images/flags/cc.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/cd.svg b/src/dota_notes/ui/images/flags/cd.svg new file mode 100644 index 0000000..e106ddd --- /dev/null +++ b/src/dota_notes/ui/images/flags/cd.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/cefta.svg b/src/dota_notes/ui/images/flags/cefta.svg new file mode 100644 index 0000000..f748d08 --- /dev/null +++ b/src/dota_notes/ui/images/flags/cefta.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/cf.svg b/src/dota_notes/ui/images/flags/cf.svg new file mode 100644 index 0000000..a6cd367 --- /dev/null +++ b/src/dota_notes/ui/images/flags/cf.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/cg.svg b/src/dota_notes/ui/images/flags/cg.svg new file mode 100644 index 0000000..9128715 --- /dev/null +++ b/src/dota_notes/ui/images/flags/cg.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ch.svg b/src/dota_notes/ui/images/flags/ch.svg new file mode 100644 index 0000000..b42d670 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ch.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ci.svg b/src/dota_notes/ui/images/flags/ci.svg new file mode 100644 index 0000000..e400f0c --- /dev/null +++ b/src/dota_notes/ui/images/flags/ci.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ck.svg b/src/dota_notes/ui/images/flags/ck.svg new file mode 100644 index 0000000..18e547b --- /dev/null +++ b/src/dota_notes/ui/images/flags/ck.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/cl.svg b/src/dota_notes/ui/images/flags/cl.svg new file mode 100644 index 0000000..01766fe --- /dev/null +++ b/src/dota_notes/ui/images/flags/cl.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/cm.svg b/src/dota_notes/ui/images/flags/cm.svg new file mode 100644 index 0000000..389b662 --- /dev/null +++ b/src/dota_notes/ui/images/flags/cm.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/cn.svg b/src/dota_notes/ui/images/flags/cn.svg new file mode 100644 index 0000000..10d3489 --- /dev/null +++ b/src/dota_notes/ui/images/flags/cn.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/co.svg b/src/dota_notes/ui/images/flags/co.svg new file mode 100644 index 0000000..ebd0a0f --- /dev/null +++ b/src/dota_notes/ui/images/flags/co.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/cp.svg b/src/dota_notes/ui/images/flags/cp.svg new file mode 100644 index 0000000..b3efb07 --- /dev/null +++ b/src/dota_notes/ui/images/flags/cp.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/cr.svg b/src/dota_notes/ui/images/flags/cr.svg new file mode 100644 index 0000000..5a409ee --- /dev/null +++ b/src/dota_notes/ui/images/flags/cr.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/cu.svg b/src/dota_notes/ui/images/flags/cu.svg new file mode 100644 index 0000000..6464f8e --- /dev/null +++ b/src/dota_notes/ui/images/flags/cu.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/cv.svg b/src/dota_notes/ui/images/flags/cv.svg new file mode 100644 index 0000000..5c251da --- /dev/null +++ b/src/dota_notes/ui/images/flags/cv.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/cw.svg b/src/dota_notes/ui/images/flags/cw.svg new file mode 100644 index 0000000..bb0ece2 --- /dev/null +++ b/src/dota_notes/ui/images/flags/cw.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/cx.svg b/src/dota_notes/ui/images/flags/cx.svg new file mode 100644 index 0000000..6803b3b --- /dev/null +++ b/src/dota_notes/ui/images/flags/cx.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/cy.svg b/src/dota_notes/ui/images/flags/cy.svg new file mode 100644 index 0000000..2f69bf7 --- /dev/null +++ b/src/dota_notes/ui/images/flags/cy.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/cz.svg b/src/dota_notes/ui/images/flags/cz.svg new file mode 100644 index 0000000..7913de3 --- /dev/null +++ b/src/dota_notes/ui/images/flags/cz.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/de.svg b/src/dota_notes/ui/images/flags/de.svg new file mode 100644 index 0000000..b08334b --- /dev/null +++ b/src/dota_notes/ui/images/flags/de.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/dg.svg b/src/dota_notes/ui/images/flags/dg.svg new file mode 100644 index 0000000..b9f99a9 --- /dev/null +++ b/src/dota_notes/ui/images/flags/dg.svg @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/dj.svg b/src/dota_notes/ui/images/flags/dj.svg new file mode 100644 index 0000000..ebf2fc6 --- /dev/null +++ b/src/dota_notes/ui/images/flags/dj.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/dk.svg b/src/dota_notes/ui/images/flags/dk.svg new file mode 100644 index 0000000..563277f --- /dev/null +++ b/src/dota_notes/ui/images/flags/dk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/dm.svg b/src/dota_notes/ui/images/flags/dm.svg new file mode 100644 index 0000000..60457b7 --- /dev/null +++ b/src/dota_notes/ui/images/flags/dm.svg @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/do.svg b/src/dota_notes/ui/images/flags/do.svg new file mode 100644 index 0000000..9c1becc --- /dev/null +++ b/src/dota_notes/ui/images/flags/do.svg @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/dz.svg b/src/dota_notes/ui/images/flags/dz.svg new file mode 100644 index 0000000..5ff29a7 --- /dev/null +++ b/src/dota_notes/ui/images/flags/dz.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/eac.svg b/src/dota_notes/ui/images/flags/eac.svg new file mode 100644 index 0000000..613099c --- /dev/null +++ b/src/dota_notes/ui/images/flags/eac.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ec.svg b/src/dota_notes/ui/images/flags/ec.svg new file mode 100644 index 0000000..65b7885 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ec.svg @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ee.svg b/src/dota_notes/ui/images/flags/ee.svg new file mode 100644 index 0000000..36ea288 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ee.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/eg.svg b/src/dota_notes/ui/images/flags/eg.svg new file mode 100644 index 0000000..58c943c --- /dev/null +++ b/src/dota_notes/ui/images/flags/eg.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/eh.svg b/src/dota_notes/ui/images/flags/eh.svg new file mode 100644 index 0000000..2c9525b --- /dev/null +++ b/src/dota_notes/ui/images/flags/eh.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/er.svg b/src/dota_notes/ui/images/flags/er.svg new file mode 100644 index 0000000..2705295 --- /dev/null +++ b/src/dota_notes/ui/images/flags/er.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/es-ct.svg b/src/dota_notes/ui/images/flags/es-ct.svg new file mode 100644 index 0000000..4d85911 --- /dev/null +++ b/src/dota_notes/ui/images/flags/es-ct.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/dota_notes/ui/images/flags/es-ga.svg b/src/dota_notes/ui/images/flags/es-ga.svg new file mode 100644 index 0000000..a91ffed --- /dev/null +++ b/src/dota_notes/ui/images/flags/es-ga.svg @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/es-pv.svg b/src/dota_notes/ui/images/flags/es-pv.svg new file mode 100644 index 0000000..21c8759 --- /dev/null +++ b/src/dota_notes/ui/images/flags/es-pv.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/es.svg b/src/dota_notes/ui/images/flags/es.svg new file mode 100644 index 0000000..815e0f8 --- /dev/null +++ b/src/dota_notes/ui/images/flags/es.svg @@ -0,0 +1,544 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/et.svg b/src/dota_notes/ui/images/flags/et.svg new file mode 100644 index 0000000..a3378fd --- /dev/null +++ b/src/dota_notes/ui/images/flags/et.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/eu.svg b/src/dota_notes/ui/images/flags/eu.svg new file mode 100644 index 0000000..bbfefd6 --- /dev/null +++ b/src/dota_notes/ui/images/flags/eu.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/fi.svg b/src/dota_notes/ui/images/flags/fi.svg new file mode 100644 index 0000000..470be2d --- /dev/null +++ b/src/dota_notes/ui/images/flags/fi.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/fj.svg b/src/dota_notes/ui/images/flags/fj.svg new file mode 100644 index 0000000..2d7cd98 --- /dev/null +++ b/src/dota_notes/ui/images/flags/fj.svg @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/fk.svg b/src/dota_notes/ui/images/flags/fk.svg new file mode 100644 index 0000000..b4935a5 --- /dev/null +++ b/src/dota_notes/ui/images/flags/fk.svg @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/fm.svg b/src/dota_notes/ui/images/flags/fm.svg new file mode 100644 index 0000000..85f4f47 --- /dev/null +++ b/src/dota_notes/ui/images/flags/fm.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/fo.svg b/src/dota_notes/ui/images/flags/fo.svg new file mode 100644 index 0000000..717ee20 --- /dev/null +++ b/src/dota_notes/ui/images/flags/fo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/fr.svg b/src/dota_notes/ui/images/flags/fr.svg new file mode 100644 index 0000000..79689fe --- /dev/null +++ b/src/dota_notes/ui/images/flags/fr.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/ga.svg b/src/dota_notes/ui/images/flags/ga.svg new file mode 100644 index 0000000..76edab4 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ga.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gb-eng.svg b/src/dota_notes/ui/images/flags/gb-eng.svg new file mode 100644 index 0000000..12e3b67 --- /dev/null +++ b/src/dota_notes/ui/images/flags/gb-eng.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/gb-nir.svg b/src/dota_notes/ui/images/flags/gb-nir.svg new file mode 100644 index 0000000..c9510f3 --- /dev/null +++ b/src/dota_notes/ui/images/flags/gb-nir.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gb-sct.svg b/src/dota_notes/ui/images/flags/gb-sct.svg new file mode 100644 index 0000000..f50cd32 --- /dev/null +++ b/src/dota_notes/ui/images/flags/gb-sct.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/dota_notes/ui/images/flags/gb-wls.svg b/src/dota_notes/ui/images/flags/gb-wls.svg new file mode 100644 index 0000000..6e15fd0 --- /dev/null +++ b/src/dota_notes/ui/images/flags/gb-wls.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gb.svg b/src/dota_notes/ui/images/flags/gb.svg new file mode 100644 index 0000000..dbac25e --- /dev/null +++ b/src/dota_notes/ui/images/flags/gb.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gd.svg b/src/dota_notes/ui/images/flags/gd.svg new file mode 100644 index 0000000..f44e839 --- /dev/null +++ b/src/dota_notes/ui/images/flags/gd.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ge.svg b/src/dota_notes/ui/images/flags/ge.svg new file mode 100644 index 0000000..d8126ec --- /dev/null +++ b/src/dota_notes/ui/images/flags/ge.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/gf.svg b/src/dota_notes/ui/images/flags/gf.svg new file mode 100644 index 0000000..7349342 --- /dev/null +++ b/src/dota_notes/ui/images/flags/gf.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/gg.svg b/src/dota_notes/ui/images/flags/gg.svg new file mode 100644 index 0000000..f8216c8 --- /dev/null +++ b/src/dota_notes/ui/images/flags/gg.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gh.svg b/src/dota_notes/ui/images/flags/gh.svg new file mode 100644 index 0000000..a6497de --- /dev/null +++ b/src/dota_notes/ui/images/flags/gh.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/gi.svg b/src/dota_notes/ui/images/flags/gi.svg new file mode 100644 index 0000000..92496be --- /dev/null +++ b/src/dota_notes/ui/images/flags/gi.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gl.svg b/src/dota_notes/ui/images/flags/gl.svg new file mode 100644 index 0000000..eb5a52e --- /dev/null +++ b/src/dota_notes/ui/images/flags/gl.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/dota_notes/ui/images/flags/gm.svg b/src/dota_notes/ui/images/flags/gm.svg new file mode 100644 index 0000000..8fe9d66 --- /dev/null +++ b/src/dota_notes/ui/images/flags/gm.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gn.svg b/src/dota_notes/ui/images/flags/gn.svg new file mode 100644 index 0000000..40d6ad4 --- /dev/null +++ b/src/dota_notes/ui/images/flags/gn.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gp.svg b/src/dota_notes/ui/images/flags/gp.svg new file mode 100644 index 0000000..528e554 --- /dev/null +++ b/src/dota_notes/ui/images/flags/gp.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/gq.svg b/src/dota_notes/ui/images/flags/gq.svg new file mode 100644 index 0000000..ba2acf2 --- /dev/null +++ b/src/dota_notes/ui/images/flags/gq.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gr.svg b/src/dota_notes/ui/images/flags/gr.svg new file mode 100644 index 0000000..599741e --- /dev/null +++ b/src/dota_notes/ui/images/flags/gr.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gs.svg b/src/dota_notes/ui/images/flags/gs.svg new file mode 100644 index 0000000..2e045df --- /dev/null +++ b/src/dota_notes/ui/images/flags/gs.svg @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gt.svg b/src/dota_notes/ui/images/flags/gt.svg new file mode 100644 index 0000000..9b34712 --- /dev/null +++ b/src/dota_notes/ui/images/flags/gt.svg @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gu.svg b/src/dota_notes/ui/images/flags/gu.svg new file mode 100644 index 0000000..a5584ff --- /dev/null +++ b/src/dota_notes/ui/images/flags/gu.svg @@ -0,0 +1,23 @@ + + + + + + + + + + G + U + A + M + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gw.svg b/src/dota_notes/ui/images/flags/gw.svg new file mode 100644 index 0000000..b8d566a --- /dev/null +++ b/src/dota_notes/ui/images/flags/gw.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gy.svg b/src/dota_notes/ui/images/flags/gy.svg new file mode 100644 index 0000000..f4d9b8a --- /dev/null +++ b/src/dota_notes/ui/images/flags/gy.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/hk.svg b/src/dota_notes/ui/images/flags/hk.svg new file mode 100644 index 0000000..ec40b5f --- /dev/null +++ b/src/dota_notes/ui/images/flags/hk.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/hm.svg b/src/dota_notes/ui/images/flags/hm.svg new file mode 100644 index 0000000..c0748d3 --- /dev/null +++ b/src/dota_notes/ui/images/flags/hm.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/hn.svg b/src/dota_notes/ui/images/flags/hn.svg new file mode 100644 index 0000000..1c166dc --- /dev/null +++ b/src/dota_notes/ui/images/flags/hn.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/hr.svg b/src/dota_notes/ui/images/flags/hr.svg new file mode 100644 index 0000000..febbc24 --- /dev/null +++ b/src/dota_notes/ui/images/flags/hr.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ht.svg b/src/dota_notes/ui/images/flags/ht.svg new file mode 100644 index 0000000..4cd4470 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ht.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/hu.svg b/src/dota_notes/ui/images/flags/hu.svg new file mode 100644 index 0000000..baddf7f --- /dev/null +++ b/src/dota_notes/ui/images/flags/hu.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ic.svg b/src/dota_notes/ui/images/flags/ic.svg new file mode 100644 index 0000000..81e6ee2 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ic.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/id.svg b/src/dota_notes/ui/images/flags/id.svg new file mode 100644 index 0000000..3b7c8fc --- /dev/null +++ b/src/dota_notes/ui/images/flags/id.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/dota_notes/ui/images/flags/ie.svg b/src/dota_notes/ui/images/flags/ie.svg new file mode 100644 index 0000000..049be14 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ie.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/il.svg b/src/dota_notes/ui/images/flags/il.svg new file mode 100644 index 0000000..724cf8b --- /dev/null +++ b/src/dota_notes/ui/images/flags/il.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/im.svg b/src/dota_notes/ui/images/flags/im.svg new file mode 100644 index 0000000..3d597a1 --- /dev/null +++ b/src/dota_notes/ui/images/flags/im.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/in.svg b/src/dota_notes/ui/images/flags/in.svg new file mode 100644 index 0000000..c634f68 --- /dev/null +++ b/src/dota_notes/ui/images/flags/in.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/io.svg b/src/dota_notes/ui/images/flags/io.svg new file mode 100644 index 0000000..b04c46f --- /dev/null +++ b/src/dota_notes/ui/images/flags/io.svg @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/iq.svg b/src/dota_notes/ui/images/flags/iq.svg new file mode 100644 index 0000000..6891785 --- /dev/null +++ b/src/dota_notes/ui/images/flags/iq.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ir.svg b/src/dota_notes/ui/images/flags/ir.svg new file mode 100644 index 0000000..5c9609e --- /dev/null +++ b/src/dota_notes/ui/images/flags/ir.svg @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/is.svg b/src/dota_notes/ui/images/flags/is.svg new file mode 100644 index 0000000..56cc977 --- /dev/null +++ b/src/dota_notes/ui/images/flags/is.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/it.svg b/src/dota_notes/ui/images/flags/it.svg new file mode 100644 index 0000000..20a8bfd --- /dev/null +++ b/src/dota_notes/ui/images/flags/it.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/je.svg b/src/dota_notes/ui/images/flags/je.svg new file mode 100644 index 0000000..e69e4f4 --- /dev/null +++ b/src/dota_notes/ui/images/flags/je.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/jm.svg b/src/dota_notes/ui/images/flags/jm.svg new file mode 100644 index 0000000..e03a342 --- /dev/null +++ b/src/dota_notes/ui/images/flags/jm.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/jo.svg b/src/dota_notes/ui/images/flags/jo.svg new file mode 100644 index 0000000..5080291 --- /dev/null +++ b/src/dota_notes/ui/images/flags/jo.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/jp.svg b/src/dota_notes/ui/images/flags/jp.svg new file mode 100644 index 0000000..cd03a33 --- /dev/null +++ b/src/dota_notes/ui/images/flags/jp.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ke.svg b/src/dota_notes/ui/images/flags/ke.svg new file mode 100644 index 0000000..5b37793 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ke.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/kg.svg b/src/dota_notes/ui/images/flags/kg.svg new file mode 100644 index 0000000..626af14 --- /dev/null +++ b/src/dota_notes/ui/images/flags/kg.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/kh.svg b/src/dota_notes/ui/images/flags/kh.svg new file mode 100644 index 0000000..c658838 --- /dev/null +++ b/src/dota_notes/ui/images/flags/kh.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ki.svg b/src/dota_notes/ui/images/flags/ki.svg new file mode 100644 index 0000000..1697ffe --- /dev/null +++ b/src/dota_notes/ui/images/flags/ki.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/km.svg b/src/dota_notes/ui/images/flags/km.svg new file mode 100644 index 0000000..56d62c3 --- /dev/null +++ b/src/dota_notes/ui/images/flags/km.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/kn.svg b/src/dota_notes/ui/images/flags/kn.svg new file mode 100644 index 0000000..01a3a0a --- /dev/null +++ b/src/dota_notes/ui/images/flags/kn.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/kp.svg b/src/dota_notes/ui/images/flags/kp.svg new file mode 100644 index 0000000..94bc8e1 --- /dev/null +++ b/src/dota_notes/ui/images/flags/kp.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/kr.svg b/src/dota_notes/ui/images/flags/kr.svg new file mode 100644 index 0000000..44b51e2 --- /dev/null +++ b/src/dota_notes/ui/images/flags/kr.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/kw.svg b/src/dota_notes/ui/images/flags/kw.svg new file mode 100644 index 0000000..7ff91a8 --- /dev/null +++ b/src/dota_notes/ui/images/flags/kw.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ky.svg b/src/dota_notes/ui/images/flags/ky.svg new file mode 100644 index 0000000..d6e567b --- /dev/null +++ b/src/dota_notes/ui/images/flags/ky.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/kz.svg b/src/dota_notes/ui/images/flags/kz.svg new file mode 100644 index 0000000..a69ba7a --- /dev/null +++ b/src/dota_notes/ui/images/flags/kz.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/la.svg b/src/dota_notes/ui/images/flags/la.svg new file mode 100644 index 0000000..9723a78 --- /dev/null +++ b/src/dota_notes/ui/images/flags/la.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/lb.svg b/src/dota_notes/ui/images/flags/lb.svg new file mode 100644 index 0000000..49650ad --- /dev/null +++ b/src/dota_notes/ui/images/flags/lb.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/lc.svg b/src/dota_notes/ui/images/flags/lc.svg new file mode 100644 index 0000000..46bbc6c --- /dev/null +++ b/src/dota_notes/ui/images/flags/lc.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/li.svg b/src/dota_notes/ui/images/flags/li.svg new file mode 100644 index 0000000..a08a05a --- /dev/null +++ b/src/dota_notes/ui/images/flags/li.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/lk.svg b/src/dota_notes/ui/images/flags/lk.svg new file mode 100644 index 0000000..24c6559 --- /dev/null +++ b/src/dota_notes/ui/images/flags/lk.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/lr.svg b/src/dota_notes/ui/images/flags/lr.svg new file mode 100644 index 0000000..a31377f --- /dev/null +++ b/src/dota_notes/ui/images/flags/lr.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ls.svg b/src/dota_notes/ui/images/flags/ls.svg new file mode 100644 index 0000000..e701650 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ls.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/lt.svg b/src/dota_notes/ui/images/flags/lt.svg new file mode 100644 index 0000000..90ec5d2 --- /dev/null +++ b/src/dota_notes/ui/images/flags/lt.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/lu.svg b/src/dota_notes/ui/images/flags/lu.svg new file mode 100644 index 0000000..c31d2bf --- /dev/null +++ b/src/dota_notes/ui/images/flags/lu.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/lv.svg b/src/dota_notes/ui/images/flags/lv.svg new file mode 100644 index 0000000..6a9e75e --- /dev/null +++ b/src/dota_notes/ui/images/flags/lv.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/ly.svg b/src/dota_notes/ui/images/flags/ly.svg new file mode 100644 index 0000000..14abcb2 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ly.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ma.svg b/src/dota_notes/ui/images/flags/ma.svg new file mode 100644 index 0000000..7ce56ef --- /dev/null +++ b/src/dota_notes/ui/images/flags/ma.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/dota_notes/ui/images/flags/mc.svg b/src/dota_notes/ui/images/flags/mc.svg new file mode 100644 index 0000000..9cb6c9e --- /dev/null +++ b/src/dota_notes/ui/images/flags/mc.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/md.svg b/src/dota_notes/ui/images/flags/md.svg new file mode 100644 index 0000000..a806572 --- /dev/null +++ b/src/dota_notes/ui/images/flags/md.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/me.svg b/src/dota_notes/ui/images/flags/me.svg new file mode 100644 index 0000000..b56cce0 --- /dev/null +++ b/src/dota_notes/ui/images/flags/me.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/mf.svg b/src/dota_notes/ui/images/flags/mf.svg new file mode 100644 index 0000000..a53ce50 --- /dev/null +++ b/src/dota_notes/ui/images/flags/mf.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/mg.svg b/src/dota_notes/ui/images/flags/mg.svg new file mode 100644 index 0000000..5fa2d24 --- /dev/null +++ b/src/dota_notes/ui/images/flags/mg.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/mh.svg b/src/dota_notes/ui/images/flags/mh.svg new file mode 100644 index 0000000..46351e5 --- /dev/null +++ b/src/dota_notes/ui/images/flags/mh.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/mk.svg b/src/dota_notes/ui/images/flags/mk.svg new file mode 100644 index 0000000..4f5cae7 --- /dev/null +++ b/src/dota_notes/ui/images/flags/mk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/ml.svg b/src/dota_notes/ui/images/flags/ml.svg new file mode 100644 index 0000000..6f6b716 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ml.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/mm.svg b/src/dota_notes/ui/images/flags/mm.svg new file mode 100644 index 0000000..8ed5e6a --- /dev/null +++ b/src/dota_notes/ui/images/flags/mm.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/mn.svg b/src/dota_notes/ui/images/flags/mn.svg new file mode 100644 index 0000000..56cb072 --- /dev/null +++ b/src/dota_notes/ui/images/flags/mn.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/mo.svg b/src/dota_notes/ui/images/flags/mo.svg new file mode 100644 index 0000000..257faed --- /dev/null +++ b/src/dota_notes/ui/images/flags/mo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/mp.svg b/src/dota_notes/ui/images/flags/mp.svg new file mode 100644 index 0000000..6696fdb --- /dev/null +++ b/src/dota_notes/ui/images/flags/mp.svg @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/mq.svg b/src/dota_notes/ui/images/flags/mq.svg new file mode 100644 index 0000000..9be3452 --- /dev/null +++ b/src/dota_notes/ui/images/flags/mq.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/mr.svg b/src/dota_notes/ui/images/flags/mr.svg new file mode 100644 index 0000000..3f0a626 --- /dev/null +++ b/src/dota_notes/ui/images/flags/mr.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/ms.svg b/src/dota_notes/ui/images/flags/ms.svg new file mode 100644 index 0000000..2e6d4c5 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ms.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/mt.svg b/src/dota_notes/ui/images/flags/mt.svg new file mode 100644 index 0000000..676e801 --- /dev/null +++ b/src/dota_notes/ui/images/flags/mt.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/mu.svg b/src/dota_notes/ui/images/flags/mu.svg new file mode 100644 index 0000000..82d7a3b --- /dev/null +++ b/src/dota_notes/ui/images/flags/mu.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/mv.svg b/src/dota_notes/ui/images/flags/mv.svg new file mode 100644 index 0000000..10450f9 --- /dev/null +++ b/src/dota_notes/ui/images/flags/mv.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/mw.svg b/src/dota_notes/ui/images/flags/mw.svg new file mode 100644 index 0000000..113aae5 --- /dev/null +++ b/src/dota_notes/ui/images/flags/mw.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/mx.svg b/src/dota_notes/ui/images/flags/mx.svg new file mode 100644 index 0000000..bb305b8 --- /dev/null +++ b/src/dota_notes/ui/images/flags/mx.svg @@ -0,0 +1,382 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/my.svg b/src/dota_notes/ui/images/flags/my.svg new file mode 100644 index 0000000..264f48a --- /dev/null +++ b/src/dota_notes/ui/images/flags/my.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/mz.svg b/src/dota_notes/ui/images/flags/mz.svg new file mode 100644 index 0000000..eb02005 --- /dev/null +++ b/src/dota_notes/ui/images/flags/mz.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/na.svg b/src/dota_notes/ui/images/flags/na.svg new file mode 100644 index 0000000..799702e --- /dev/null +++ b/src/dota_notes/ui/images/flags/na.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/nc.svg b/src/dota_notes/ui/images/flags/nc.svg new file mode 100644 index 0000000..9679540 --- /dev/null +++ b/src/dota_notes/ui/images/flags/nc.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ne.svg b/src/dota_notes/ui/images/flags/ne.svg new file mode 100644 index 0000000..39a82b8 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ne.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/nf.svg b/src/dota_notes/ui/images/flags/nf.svg new file mode 100644 index 0000000..ecdb4a3 --- /dev/null +++ b/src/dota_notes/ui/images/flags/nf.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ng.svg b/src/dota_notes/ui/images/flags/ng.svg new file mode 100644 index 0000000..81eb35f --- /dev/null +++ b/src/dota_notes/ui/images/flags/ng.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/ni.svg b/src/dota_notes/ui/images/flags/ni.svg new file mode 100644 index 0000000..e16e77a --- /dev/null +++ b/src/dota_notes/ui/images/flags/ni.svg @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/nl.svg b/src/dota_notes/ui/images/flags/nl.svg new file mode 100644 index 0000000..4faaf49 --- /dev/null +++ b/src/dota_notes/ui/images/flags/nl.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/no.svg b/src/dota_notes/ui/images/flags/no.svg new file mode 100644 index 0000000..a5f2a15 --- /dev/null +++ b/src/dota_notes/ui/images/flags/no.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/np.svg b/src/dota_notes/ui/images/flags/np.svg new file mode 100644 index 0000000..fead940 --- /dev/null +++ b/src/dota_notes/ui/images/flags/np.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/nr.svg b/src/dota_notes/ui/images/flags/nr.svg new file mode 100644 index 0000000..e71ddcd --- /dev/null +++ b/src/dota_notes/ui/images/flags/nr.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/nu.svg b/src/dota_notes/ui/images/flags/nu.svg new file mode 100644 index 0000000..4067baf --- /dev/null +++ b/src/dota_notes/ui/images/flags/nu.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/nz.svg b/src/dota_notes/ui/images/flags/nz.svg new file mode 100644 index 0000000..04d08dc --- /dev/null +++ b/src/dota_notes/ui/images/flags/nz.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/om.svg b/src/dota_notes/ui/images/flags/om.svg new file mode 100644 index 0000000..1c76217 --- /dev/null +++ b/src/dota_notes/ui/images/flags/om.svg @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/pa.svg b/src/dota_notes/ui/images/flags/pa.svg new file mode 100644 index 0000000..8dc03bc --- /dev/null +++ b/src/dota_notes/ui/images/flags/pa.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/pe.svg b/src/dota_notes/ui/images/flags/pe.svg new file mode 100644 index 0000000..b30df9a --- /dev/null +++ b/src/dota_notes/ui/images/flags/pe.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/dota_notes/ui/images/flags/pf.svg b/src/dota_notes/ui/images/flags/pf.svg new file mode 100644 index 0000000..16374f3 --- /dev/null +++ b/src/dota_notes/ui/images/flags/pf.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/pg.svg b/src/dota_notes/ui/images/flags/pg.svg new file mode 100644 index 0000000..1080add --- /dev/null +++ b/src/dota_notes/ui/images/flags/pg.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ph.svg b/src/dota_notes/ui/images/flags/ph.svg new file mode 100644 index 0000000..65489e1 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ph.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/pk.svg b/src/dota_notes/ui/images/flags/pk.svg new file mode 100644 index 0000000..fa02f6a --- /dev/null +++ b/src/dota_notes/ui/images/flags/pk.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/pl.svg b/src/dota_notes/ui/images/flags/pl.svg new file mode 100644 index 0000000..0fa5145 --- /dev/null +++ b/src/dota_notes/ui/images/flags/pl.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/pm.svg b/src/dota_notes/ui/images/flags/pm.svg new file mode 100644 index 0000000..401139f --- /dev/null +++ b/src/dota_notes/ui/images/flags/pm.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/pn.svg b/src/dota_notes/ui/images/flags/pn.svg new file mode 100644 index 0000000..9788c9c --- /dev/null +++ b/src/dota_notes/ui/images/flags/pn.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/pr.svg b/src/dota_notes/ui/images/flags/pr.svg new file mode 100644 index 0000000..3cb403b --- /dev/null +++ b/src/dota_notes/ui/images/flags/pr.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ps.svg b/src/dota_notes/ui/images/flags/ps.svg new file mode 100644 index 0000000..8203148 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ps.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/pt.svg b/src/dota_notes/ui/images/flags/pt.svg new file mode 100644 index 0000000..2f36b7e --- /dev/null +++ b/src/dota_notes/ui/images/flags/pt.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/pw.svg b/src/dota_notes/ui/images/flags/pw.svg new file mode 100644 index 0000000..089cbce --- /dev/null +++ b/src/dota_notes/ui/images/flags/pw.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/py.svg b/src/dota_notes/ui/images/flags/py.svg new file mode 100644 index 0000000..bfbf01f --- /dev/null +++ b/src/dota_notes/ui/images/flags/py.svg @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/qa.svg b/src/dota_notes/ui/images/flags/qa.svg new file mode 100644 index 0000000..bd493c3 --- /dev/null +++ b/src/dota_notes/ui/images/flags/qa.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/dota_notes/ui/images/flags/re.svg b/src/dota_notes/ui/images/flags/re.svg new file mode 100644 index 0000000..3225ddd --- /dev/null +++ b/src/dota_notes/ui/images/flags/re.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/ro.svg b/src/dota_notes/ui/images/flags/ro.svg new file mode 100644 index 0000000..fda0f7b --- /dev/null +++ b/src/dota_notes/ui/images/flags/ro.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/rs.svg b/src/dota_notes/ui/images/flags/rs.svg new file mode 100644 index 0000000..120293a --- /dev/null +++ b/src/dota_notes/ui/images/flags/rs.svg @@ -0,0 +1,292 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ru.svg b/src/dota_notes/ui/images/flags/ru.svg new file mode 100644 index 0000000..f4d27ef --- /dev/null +++ b/src/dota_notes/ui/images/flags/ru.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/rw.svg b/src/dota_notes/ui/images/flags/rw.svg new file mode 100644 index 0000000..6cc669e --- /dev/null +++ b/src/dota_notes/ui/images/flags/rw.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sa.svg b/src/dota_notes/ui/images/flags/sa.svg new file mode 100644 index 0000000..660396a --- /dev/null +++ b/src/dota_notes/ui/images/flags/sa.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sb.svg b/src/dota_notes/ui/images/flags/sb.svg new file mode 100644 index 0000000..a011360 --- /dev/null +++ b/src/dota_notes/ui/images/flags/sb.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sc.svg b/src/dota_notes/ui/images/flags/sc.svg new file mode 100644 index 0000000..9a46b36 --- /dev/null +++ b/src/dota_notes/ui/images/flags/sc.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sd.svg b/src/dota_notes/ui/images/flags/sd.svg new file mode 100644 index 0000000..b8e4b97 --- /dev/null +++ b/src/dota_notes/ui/images/flags/sd.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/se.svg b/src/dota_notes/ui/images/flags/se.svg new file mode 100644 index 0000000..0e41780 --- /dev/null +++ b/src/dota_notes/ui/images/flags/se.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/dota_notes/ui/images/flags/sg.svg b/src/dota_notes/ui/images/flags/sg.svg new file mode 100644 index 0000000..c4dd4ac --- /dev/null +++ b/src/dota_notes/ui/images/flags/sg.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sh.svg b/src/dota_notes/ui/images/flags/sh.svg new file mode 100644 index 0000000..131b069 --- /dev/null +++ b/src/dota_notes/ui/images/flags/sh.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/si.svg b/src/dota_notes/ui/images/flags/si.svg new file mode 100644 index 0000000..f2aea01 --- /dev/null +++ b/src/dota_notes/ui/images/flags/si.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sj.svg b/src/dota_notes/ui/images/flags/sj.svg new file mode 100644 index 0000000..bb2799c --- /dev/null +++ b/src/dota_notes/ui/images/flags/sj.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sk.svg b/src/dota_notes/ui/images/flags/sk.svg new file mode 100644 index 0000000..a1953fa --- /dev/null +++ b/src/dota_notes/ui/images/flags/sk.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sl.svg b/src/dota_notes/ui/images/flags/sl.svg new file mode 100644 index 0000000..a07baf7 --- /dev/null +++ b/src/dota_notes/ui/images/flags/sl.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sm.svg b/src/dota_notes/ui/images/flags/sm.svg new file mode 100644 index 0000000..0892990 --- /dev/null +++ b/src/dota_notes/ui/images/flags/sm.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sn.svg b/src/dota_notes/ui/images/flags/sn.svg new file mode 100644 index 0000000..7c0673d --- /dev/null +++ b/src/dota_notes/ui/images/flags/sn.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/so.svg b/src/dota_notes/ui/images/flags/so.svg new file mode 100644 index 0000000..ae582f1 --- /dev/null +++ b/src/dota_notes/ui/images/flags/so.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sr.svg b/src/dota_notes/ui/images/flags/sr.svg new file mode 100644 index 0000000..5e71c40 --- /dev/null +++ b/src/dota_notes/ui/images/flags/sr.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/ss.svg b/src/dota_notes/ui/images/flags/ss.svg new file mode 100644 index 0000000..73804d8 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ss.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/st.svg b/src/dota_notes/ui/images/flags/st.svg new file mode 100644 index 0000000..f2e75c1 --- /dev/null +++ b/src/dota_notes/ui/images/flags/st.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sv.svg b/src/dota_notes/ui/images/flags/sv.svg new file mode 100644 index 0000000..3a63913 --- /dev/null +++ b/src/dota_notes/ui/images/flags/sv.svg @@ -0,0 +1,594 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sx.svg b/src/dota_notes/ui/images/flags/sx.svg new file mode 100644 index 0000000..84844e0 --- /dev/null +++ b/src/dota_notes/ui/images/flags/sx.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sy.svg b/src/dota_notes/ui/images/flags/sy.svg new file mode 100644 index 0000000..29636ae --- /dev/null +++ b/src/dota_notes/ui/images/flags/sy.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/sz.svg b/src/dota_notes/ui/images/flags/sz.svg new file mode 100644 index 0000000..5eef691 --- /dev/null +++ b/src/dota_notes/ui/images/flags/sz.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ta.svg b/src/dota_notes/ui/images/flags/ta.svg new file mode 100644 index 0000000..b68ad23 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ta.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/tc.svg b/src/dota_notes/ui/images/flags/tc.svg new file mode 100644 index 0000000..89d29bb --- /dev/null +++ b/src/dota_notes/ui/images/flags/tc.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/td.svg b/src/dota_notes/ui/images/flags/td.svg new file mode 100644 index 0000000..fa3bd92 --- /dev/null +++ b/src/dota_notes/ui/images/flags/td.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/tf.svg b/src/dota_notes/ui/images/flags/tf.svg new file mode 100644 index 0000000..88323d2 --- /dev/null +++ b/src/dota_notes/ui/images/flags/tf.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/tg.svg b/src/dota_notes/ui/images/flags/tg.svg new file mode 100644 index 0000000..e20f40d --- /dev/null +++ b/src/dota_notes/ui/images/flags/tg.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/th.svg b/src/dota_notes/ui/images/flags/th.svg new file mode 100644 index 0000000..1e93a61 --- /dev/null +++ b/src/dota_notes/ui/images/flags/th.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/tj.svg b/src/dota_notes/ui/images/flags/tj.svg new file mode 100644 index 0000000..d2ba733 --- /dev/null +++ b/src/dota_notes/ui/images/flags/tj.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/tk.svg b/src/dota_notes/ui/images/flags/tk.svg new file mode 100644 index 0000000..65bab13 --- /dev/null +++ b/src/dota_notes/ui/images/flags/tk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/tl.svg b/src/dota_notes/ui/images/flags/tl.svg new file mode 100644 index 0000000..bcfc161 --- /dev/null +++ b/src/dota_notes/ui/images/flags/tl.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/tm.svg b/src/dota_notes/ui/images/flags/tm.svg new file mode 100644 index 0000000..08792a7 --- /dev/null +++ b/src/dota_notes/ui/images/flags/tm.svg @@ -0,0 +1,205 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/tn.svg b/src/dota_notes/ui/images/flags/tn.svg new file mode 100644 index 0000000..6a1989b --- /dev/null +++ b/src/dota_notes/ui/images/flags/tn.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/dota_notes/ui/images/flags/to.svg b/src/dota_notes/ui/images/flags/to.svg new file mode 100644 index 0000000..d072337 --- /dev/null +++ b/src/dota_notes/ui/images/flags/to.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/tr.svg b/src/dota_notes/ui/images/flags/tr.svg new file mode 100644 index 0000000..a92804f --- /dev/null +++ b/src/dota_notes/ui/images/flags/tr.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/tt.svg b/src/dota_notes/ui/images/flags/tt.svg new file mode 100644 index 0000000..14adbe0 --- /dev/null +++ b/src/dota_notes/ui/images/flags/tt.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/tv.svg b/src/dota_notes/ui/images/flags/tv.svg new file mode 100644 index 0000000..675210e --- /dev/null +++ b/src/dota_notes/ui/images/flags/tv.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/tw.svg b/src/dota_notes/ui/images/flags/tw.svg new file mode 100644 index 0000000..57fd98b --- /dev/null +++ b/src/dota_notes/ui/images/flags/tw.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/tz.svg b/src/dota_notes/ui/images/flags/tz.svg new file mode 100644 index 0000000..751c167 --- /dev/null +++ b/src/dota_notes/ui/images/flags/tz.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ua.svg b/src/dota_notes/ui/images/flags/ua.svg new file mode 100644 index 0000000..a339eb1 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ua.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/ug.svg b/src/dota_notes/ui/images/flags/ug.svg new file mode 100644 index 0000000..78252a4 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ug.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/um.svg b/src/dota_notes/ui/images/flags/um.svg new file mode 100644 index 0000000..e041594 --- /dev/null +++ b/src/dota_notes/ui/images/flags/um.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/un.svg b/src/dota_notes/ui/images/flags/un.svg new file mode 100644 index 0000000..e475337 --- /dev/null +++ b/src/dota_notes/ui/images/flags/un.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/us.svg b/src/dota_notes/ui/images/flags/us.svg new file mode 100644 index 0000000..615946d --- /dev/null +++ b/src/dota_notes/ui/images/flags/us.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/uy.svg b/src/dota_notes/ui/images/flags/uy.svg new file mode 100644 index 0000000..4a54b85 --- /dev/null +++ b/src/dota_notes/ui/images/flags/uy.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/uz.svg b/src/dota_notes/ui/images/flags/uz.svg new file mode 100644 index 0000000..aaf9382 --- /dev/null +++ b/src/dota_notes/ui/images/flags/uz.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/va.svg b/src/dota_notes/ui/images/flags/va.svg new file mode 100644 index 0000000..c7d8791 --- /dev/null +++ b/src/dota_notes/ui/images/flags/va.svg @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/vc.svg b/src/dota_notes/ui/images/flags/vc.svg new file mode 100644 index 0000000..450f6f0 --- /dev/null +++ b/src/dota_notes/ui/images/flags/vc.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ve.svg b/src/dota_notes/ui/images/flags/ve.svg new file mode 100644 index 0000000..314e7f5 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ve.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/vg.svg b/src/dota_notes/ui/images/flags/vg.svg new file mode 100644 index 0000000..4d2c397 --- /dev/null +++ b/src/dota_notes/ui/images/flags/vg.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/vi.svg b/src/dota_notes/ui/images/flags/vi.svg new file mode 100644 index 0000000..3a64338 --- /dev/null +++ b/src/dota_notes/ui/images/flags/vi.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/vn.svg b/src/dota_notes/ui/images/flags/vn.svg new file mode 100644 index 0000000..24bedc5 --- /dev/null +++ b/src/dota_notes/ui/images/flags/vn.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/vu.svg b/src/dota_notes/ui/images/flags/vu.svg new file mode 100644 index 0000000..efcff89 --- /dev/null +++ b/src/dota_notes/ui/images/flags/vu.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/wf.svg b/src/dota_notes/ui/images/flags/wf.svg new file mode 100644 index 0000000..57feb3a --- /dev/null +++ b/src/dota_notes/ui/images/flags/wf.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/ws.svg b/src/dota_notes/ui/images/flags/ws.svg new file mode 100644 index 0000000..0e758a7 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ws.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/xk.svg b/src/dota_notes/ui/images/flags/xk.svg new file mode 100644 index 0000000..de6ef4d --- /dev/null +++ b/src/dota_notes/ui/images/flags/xk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/xx.svg b/src/dota_notes/ui/images/flags/xx.svg new file mode 100644 index 0000000..9333be3 --- /dev/null +++ b/src/dota_notes/ui/images/flags/xx.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/dota_notes/ui/images/flags/ye.svg b/src/dota_notes/ui/images/flags/ye.svg new file mode 100644 index 0000000..61f0ed6 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ye.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/yt.svg b/src/dota_notes/ui/images/flags/yt.svg new file mode 100644 index 0000000..5ea2f64 --- /dev/null +++ b/src/dota_notes/ui/images/flags/yt.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/za.svg b/src/dota_notes/ui/images/flags/za.svg new file mode 100644 index 0000000..aa54beb --- /dev/null +++ b/src/dota_notes/ui/images/flags/za.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/zm.svg b/src/dota_notes/ui/images/flags/zm.svg new file mode 100644 index 0000000..b8fdd63 --- /dev/null +++ b/src/dota_notes/ui/images/flags/zm.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/zw.svg b/src/dota_notes/ui/images/flags/zw.svg new file mode 100644 index 0000000..5c19746 --- /dev/null +++ b/src/dota_notes/ui/images/flags/zw.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/history.svg b/src/dota_notes/ui/images/history.svg new file mode 100644 index 0000000..3dfff5d --- /dev/null +++ b/src/dota_notes/ui/images/history.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/dota_notes/ui/images/note.svg b/src/dota_notes/ui/images/note.svg new file mode 100644 index 0000000..64740c6 --- /dev/null +++ b/src/dota_notes/ui/images/note.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/dota_notes/ui/images/person_search.svg b/src/dota_notes/ui/images/person_search.svg new file mode 100644 index 0000000..6135ccd --- /dev/null +++ b/src/dota_notes/ui/images/person_search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/dota_notes/ui/images/public.svg b/src/dota_notes/ui/images/public.svg new file mode 100644 index 0000000..c00b531 --- /dev/null +++ b/src/dota_notes/ui/images/public.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/dota_notes/ui/images/smurf.png b/src/dota_notes/ui/images/smurf.png new file mode 100644 index 0000000..6e0f5b5 Binary files /dev/null and b/src/dota_notes/ui/images/smurf.png differ diff --git a/src/dota_notes/ui/images/videogame_asset.svg b/src/dota_notes/ui/images/videogame_asset.svg new file mode 100644 index 0000000..f29ca63 --- /dev/null +++ b/src/dota_notes/ui/images/videogame_asset.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/dota_notes/ui/main_window.py b/src/dota_notes/ui/main_window.py index c706486..88bd681 100644 --- a/src/dota_notes/ui/main_window.py +++ b/src/dota_notes/ui/main_window.py @@ -1,7 +1,9 @@ from datetime import datetime +from PySide6.QtGui import QFontDatabase, QPixmap from PySide6.QtWidgets import QMainWindow +from dota_notes.helpers import ISO_3166_COUNTRIES from dota_notes.ui.ui_main_window import Ui_MainWindow @@ -15,44 +17,27 @@ class MainWindow(QMainWindow, Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) + QFontDatabase().addApplicationFont(":/fonts/Roboto-Medium.ttf") + self.centralStackedWidget.setCurrentIndex(0) for smurf_choice in self.SMURF_CHOICES: self.comboBoxDetailsSmurf.addItem(smurf_choice) - for mode_choice in self.MODE_CHOICES: - self.comboBoxSettingsMode.addItem(mode_choice) - self.comboBoxSettingsMode.currentTextChanged.connect(self.on_settings_mode_changed) for i in range(10): for flag in self.FLAGS: getattr(self, f"labelPlayer{i}Flag{flag}").setVisible(False) - - self.draw_connection_status("Off", "Off") + getattr(self, f"labelPlayer{i}SmurfStratz").setVisible(False) + getattr(self, f"labelPlayer{i}Note").setVisible(False) def draw_status_message(self, message, timeout=0): """Draw a bottom status message with a date in front""" self.statusBar().showMessage(datetime.now().strftime("%H:%M:%S - ") + message, timeout) - def draw_connection_status(self, steam: str, dota: str): - """Display the correct label corresponding to the connection status""" - possible_status = ["On", "Try", "Off"] - for client in ["Steam", "Dota"]: - for status in possible_status: - getattr(self, f"label{client}Con{status}").setVisible(False) - if steam not in possible_status or dota not in possible_status: - return - getattr(self, f"labelSteamCon{steam}").setVisible(True) - getattr(self, f"labelDotaCon{dota}").setVisible(True) - - if steam == "Off" and dota == "Off": - self.buttonConnect.setVisible(True) - else: - self.buttonConnect.setVisible(False) - def draw_match_with_state(self, data): """Draw a match info in the main widget""" + self.labelGSIMatchId.setText(str(data.last_gsi_match_id)) self.labelMatchId.setText(str(data.match_id)) - self.labelServerId.setText(str(data.server_id)) for index, player in enumerate(data.players): if index > 9: break @@ -61,29 +46,56 @@ def draw_match_with_state(self, data): def draw_match_player(self, player_slot, player_data): """Draw the player information on the specific slot""" getattr(self, f"labelPlayer{player_slot}Name").setText(player_data.name) - getattr(self, f"labelPlayer{player_slot}ProName").setText( - player_data.pro_name if player_data.pro_name is not None else "") + getattr(self, f"labelPlayer{player_slot}Level").setText( + str(player_data.account_level) if player_data.account_level is not None else "") getattr(self, f"labelPlayer{player_slot}CustomName").setText( player_data.custom_name if player_data.custom_name is not None else "") + if player_data.country_code == "": + getattr(self, f"labelPlayer{player_slot}Country").setToolTip("") + getattr(self, f"labelPlayer{player_slot}Country").setPixmap(QPixmap()) + else: + getattr(self, f"labelPlayer{player_slot}Country").setToolTip( + ISO_3166_COUNTRIES.get(player_data.country_code, "")) + getattr(self, f"labelPlayer{player_slot}Country").setPixmap( + QPixmap(f":/images/flags/{player_data.country_code.lower()}.svg")) + getattr(self, f"labelPlayer{player_slot}ProName").setText( + player_data.pro_name if player_data.pro_name is not None else "") + getattr(self, f"labelPlayer{player_slot}GameCount").setText( + str(player_data.match_count) if player_data.match_count is not None else "") getattr(self, f"labelPlayer{player_slot}Smurf").setText(player_data.smurf) + if player_data.smurf_stratz is not None and player_data.smurf_stratz != 0: + getattr(self, f"labelPlayer{player_slot}SmurfStratz").setVisible(True) + getattr(self, f"labelPlayer{player_slot}SmurfStratz").setText(str(player_data.smurf_stratz)) + else: + getattr(self, f"labelPlayer{player_slot}SmurfStratz").setVisible(False) + getattr(self, f"labelPlayer{player_slot}SmurfStratz").setText("") getattr(self, f"labelPlayer{player_slot}FlagRacist").setVisible(player_data.is_racist) getattr(self, f"labelPlayer{player_slot}FlagSexist").setVisible(player_data.is_sexist) getattr(self, f"labelPlayer{player_slot}FlagToxic").setVisible(player_data.is_toxic) getattr(self, f"labelPlayer{player_slot}FlagFeeder").setVisible(player_data.is_feeder) getattr(self, f"labelPlayer{player_slot}FlagGivesUp").setVisible(player_data.gives_up) getattr(self, f"labelPlayer{player_slot}FlagDestroyer").setVisible(player_data.destroys_items) + getattr(self, f"labelPlayer{player_slot}Note").setVisible(len(player_data.note) > 0) + + def draw_details_with_player(self, player_state): + """Draw the details section with a specified player. - def on_settings_mode_changed(self, new_current_text): - """When the user select a new mode, modify the Settings UI accordingly""" - if new_current_text == "Proxy": - self.lineEditSettingsProxyURL.setEnabled(True) - self.lineEditSettingsProxyAPIKey.setEnabled(True) - self.lineEditSettingsSteamUser.setEnabled(False) - self.lineEditSettingsSteamPassword.setEnabled(False) - self.lineEditSettingsSteamAPIKey.setEnabled(False) - elif new_current_text == "Client": - self.lineEditSettingsProxyURL.setEnabled(False) - self.lineEditSettingsProxyAPIKey.setEnabled(False) - self.lineEditSettingsSteamUser.setEnabled(True) - self.lineEditSettingsSteamPassword.setEnabled(True) - self.lineEditSettingsSteamAPIKey.setEnabled(True) + Args: + player_state: player state to draw in the section + """ + self.labelDetailsSteamId.setText(str(player_state.steam_id)) + self.labelDetailsName.setText(player_state.name) + self.inputDetailsCustomName.setText(player_state.custom_name) + self.labelDetailsProName.setText( + player_state.pro_name if player_state.pro_name is not None else "") + self.labelDetailsMatchCount.setText(str(player_state.match_count)) + self.labelDetailsSmurfStratz.setText( + str(player_state.smurf_stratz) if player_state.smurf_stratz is not None else "") + self.comboBoxDetailsSmurf.setCurrentText(player_state.smurf) + self.checkBoxDetailsRacist.setChecked(player_state.is_racist) + self.checkBoxDetailsSexist.setChecked(player_state.is_sexist) + self.checkBoxDetailsToxic.setChecked(player_state.is_toxic) + self.checkBoxDetailsFeeder.setChecked(player_state.is_feeder) + self.checkBoxDetailsGivesUp.setChecked(player_state.gives_up) + self.checkBoxDetailsDestroysItems.setChecked(player_state.destroys_items) + self.inputDetailsNote.setPlainText(player_state.note) diff --git a/src/dota_notes/ui/resources.qrc b/src/dota_notes/ui/resources.qrc index 8039742..f092f55 100644 --- a/src/dota_notes/ui/resources.qrc +++ b/src/dota_notes/ui/resources.qrc @@ -1,5 +1,281 @@ + images/description.svg + images/flags/ac.svg + images/flags/ad.svg + images/flags/ae.svg + images/flags/af.svg + images/flags/ag.svg + images/flags/ai.svg + images/flags/al.svg + images/flags/am.svg + images/flags/ao.svg + images/flags/aq.svg + images/flags/ar.svg + images/flags/arab.svg + images/flags/as.svg + images/flags/at.svg + images/flags/au.svg + images/flags/aw.svg + images/flags/ax.svg + images/flags/az.svg + images/flags/ba.svg + images/flags/bb.svg + images/flags/bd.svg + images/flags/be.svg + images/flags/bf.svg + images/flags/bg.svg + images/flags/bh.svg + images/flags/bi.svg + images/flags/bj.svg + images/flags/bl.svg + images/flags/bm.svg + images/flags/bn.svg + images/flags/bo.svg + images/flags/bq.svg + images/flags/br.svg + images/flags/bs.svg + images/flags/bt.svg + images/flags/bv.svg + images/flags/bw.svg + images/flags/by.svg + images/flags/bz.svg + images/flags/ca.svg + images/flags/cc.svg + images/flags/cd.svg + images/flags/cefta.svg + images/flags/cf.svg + images/flags/cg.svg + images/flags/ch.svg + images/flags/ci.svg + images/flags/ck.svg + images/flags/cl.svg + images/flags/cm.svg + images/flags/cn.svg + images/flags/co.svg + images/flags/cp.svg + images/flags/cr.svg + images/flags/cu.svg + images/flags/cv.svg + images/flags/cw.svg + images/flags/cx.svg + images/flags/cy.svg + images/flags/cz.svg + images/flags/de.svg + images/flags/dg.svg + images/flags/dj.svg + images/flags/dk.svg + images/flags/dm.svg + images/flags/do.svg + images/flags/dz.svg + images/flags/eac.svg + images/flags/ec.svg + images/flags/ee.svg + images/flags/eg.svg + images/flags/eh.svg + images/flags/er.svg + images/flags/es.svg + images/flags/es-ct.svg + images/flags/es-ga.svg + images/flags/es-pv.svg + images/flags/et.svg + images/flags/eu.svg + images/flags/fi.svg + images/flags/fj.svg + images/flags/fk.svg + images/flags/fm.svg + images/flags/fo.svg + images/flags/fr.svg + images/flags/ga.svg + images/flags/gb.svg + images/flags/gb-eng.svg + images/flags/gb-nir.svg + images/flags/gb-sct.svg + images/flags/gb-wls.svg + images/flags/gd.svg + images/flags/ge.svg + images/flags/gf.svg + images/flags/gg.svg + images/flags/gh.svg + images/flags/gi.svg + images/flags/gl.svg + images/flags/gm.svg + images/flags/gn.svg + images/flags/gp.svg + images/flags/gq.svg + images/flags/gr.svg + images/flags/gs.svg + images/flags/gt.svg + images/flags/gu.svg + images/flags/gw.svg + images/flags/gy.svg + images/flags/hk.svg + images/flags/hm.svg + images/flags/hn.svg + images/flags/hr.svg + images/flags/ht.svg + images/flags/hu.svg + images/flags/ic.svg + images/flags/id.svg + images/flags/ie.svg + images/flags/il.svg + images/flags/im.svg + images/flags/in.svg + images/flags/io.svg + images/flags/iq.svg + images/flags/ir.svg + images/flags/is.svg + images/flags/it.svg + images/flags/je.svg + images/flags/jm.svg + images/flags/jo.svg + images/flags/jp.svg + images/flags/ke.svg + images/flags/kg.svg + images/flags/kh.svg + images/flags/ki.svg + images/flags/km.svg + images/flags/kn.svg + images/flags/kp.svg + images/flags/kr.svg + images/flags/kw.svg + images/flags/ky.svg + images/flags/kz.svg + images/flags/la.svg + images/flags/lb.svg + images/flags/lc.svg + images/flags/li.svg + images/flags/lk.svg + images/flags/lr.svg + images/flags/ls.svg + images/flags/lt.svg + images/flags/lu.svg + images/flags/lv.svg + images/flags/ly.svg + images/flags/ma.svg + images/flags/mc.svg + images/flags/md.svg + images/flags/me.svg + images/flags/mf.svg + images/flags/mg.svg + images/flags/mh.svg + images/flags/mk.svg + images/flags/ml.svg + images/flags/mm.svg + images/flags/mn.svg + images/flags/mo.svg + images/flags/mp.svg + images/flags/mq.svg + images/flags/mr.svg + images/flags/ms.svg + images/flags/mt.svg + images/flags/mu.svg + images/flags/mv.svg + images/flags/mw.svg + images/flags/mx.svg + images/flags/my.svg + images/flags/mz.svg + images/flags/na.svg + images/flags/nc.svg + images/flags/ne.svg + images/flags/nf.svg + images/flags/ng.svg + images/flags/ni.svg + images/flags/nl.svg + images/flags/no.svg + images/flags/np.svg + images/flags/nr.svg + images/flags/nu.svg + images/flags/nz.svg + images/flags/om.svg + images/flags/pa.svg + images/flags/pe.svg + images/flags/pf.svg + images/flags/pg.svg + images/flags/ph.svg + images/flags/pk.svg + images/flags/pl.svg + images/flags/pm.svg + images/flags/pn.svg + images/flags/pr.svg + images/flags/ps.svg + images/flags/pt.svg + images/flags/pw.svg + images/flags/py.svg + images/flags/qa.svg + images/flags/re.svg + images/flags/ro.svg + images/flags/rs.svg + images/flags/ru.svg + images/flags/rw.svg + images/flags/sa.svg + images/flags/sb.svg + images/flags/sc.svg + images/flags/sd.svg + images/flags/se.svg + images/flags/sg.svg + images/flags/sh.svg + images/flags/si.svg + images/flags/sj.svg + images/flags/sk.svg + images/flags/sl.svg + images/flags/sm.svg + images/flags/sn.svg + images/flags/so.svg + images/flags/sr.svg + images/flags/ss.svg + images/flags/st.svg + images/flags/sv.svg + images/flags/sx.svg + images/flags/sy.svg + images/flags/sz.svg + images/flags/ta.svg + images/flags/tc.svg + images/flags/td.svg + images/flags/tf.svg + images/flags/tg.svg + images/flags/th.svg + images/flags/tj.svg + images/flags/tk.svg + images/flags/tl.svg + images/flags/tm.svg + images/flags/tn.svg + images/flags/to.svg + images/flags/tr.svg + images/flags/tt.svg + images/flags/tv.svg + images/flags/tw.svg + images/flags/tz.svg + images/flags/ua.svg + images/flags/ug.svg + images/flags/um.svg + images/flags/un.svg + images/flags/us.svg + images/flags/uy.svg + images/flags/uz.svg + images/flags/va.svg + images/flags/vc.svg + images/flags/ve.svg + images/flags/vg.svg + images/flags/vi.svg + images/flags/vn.svg + images/flags/vu.svg + images/flags/wf.svg + images/flags/ws.svg + images/flags/xk.svg + images/flags/xx.svg + images/flags/ye.svg + images/flags/yt.svg + images/flags/za.svg + images/flags/zm.svg + images/flags/zw.svg + images/history.svg + images/note.svg + images/person_search.svg + images/public.svg + images/videogame_asset.svg + fonts/Roboto-Medium.ttf + images/smurf.png images/destroyer.png images/feeder.png images/givesup.png diff --git a/src/dota_notes/ui/ui_main_window.ui b/src/dota_notes/ui/ui_main_window.ui index f723896..30ba9e6 100644 --- a/src/dota_notes/ui/ui_main_window.ui +++ b/src/dota_notes/ui/ui_main_window.ui @@ -7,7 +7,7 @@ 0 0 1300 - 800 + 849 @@ -33,7 +33,7 @@ 0 0 1282 - 741 + 786 @@ -41,115 +41,53 @@ - - + + - - - Qt::Horizontal - - - - 40 - 20 - + + + Bububu - + - + - <html><head/><body><p><span style=" font-weight:600;">Steam</span></p></body></html> + Bulldog - - - - 0 - 0 - - - - - 20 - 20 - - - - - 20 - 20 - - - - Disconnected - - - background-color: rgb(245, 66, 66) - + - + Grubby - - - - 0 - 0 - - - - - 20 - 20 - - - - - 20 - 20 - - - - Connecting - - - background-color: rgb(255, 249, 61) - + - + Philaeux - - - - 0 - 0 - + + + s4 + + + + - 20 - 20 - - - - - 20 - 20 + 100 + 0 - Connected - - - background-color: rgb(0, 191, 29) + <html><head/><body><p>User your are targeting when looking for a game, 64bits Steam ID.</p></body></html> @@ -157,14 +95,7 @@ - - - <html><head/><body><p><span style=" font-weight:600;">Dota</span></p></body></html> - - - - - + 0 @@ -184,10 +115,10 @@ - Disconnected + <html><head/><body><p>Search info about the last game scanned by GSI.</p></body></html> - background-color: rgb(245, 66, 66) + QPushButton { border-image:url(:/images/videogame_asset.svg)} @@ -195,7 +126,7 @@ - + 0 @@ -215,10 +146,10 @@ - Connecting + <html><head/><body><p>Search the last game played by an user using Stratz.</p></body></html> - background-color: rgb(255, 249, 61) + QPushButton { border-image:url(:/images/history.svg)} @@ -226,7 +157,7 @@ - + 0 @@ -246,101 +177,16 @@ - Connected + <html><head/><body><p>Search for player info, smurf and number of games using Stratz.</p></body></html> - background-color: rgb(0, 191, 29) + QPushButton { border-image:url(:/images/person_search.svg)} - - - - Connect - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - - Bububu - - - - - - - Bulldog - - - - - - - Grubby - - - - - - - Philaeux - - - - - - - s4 - - - - - - - - 100 - 0 - - - - - - - - Search Live - - - - - - - Search Last - - - @@ -348,12 +194,9 @@ - + - <html><head/><body><p><span style=" font-weight:600;">Match ID</span></p></body></html> - - - Qt::RichText + <html><head/><body><p><span style=" font-weight:600;">Last received Match ID from GSI</span></p></body></html> Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -361,16 +204,16 @@ - + ....................... - + - <html><head/><body><p><span style=" font-weight:600;">Server ID</span></p></body></html> + <html><head/><body><p><span style=" font-weight:600;">Displayed Match ID</span></p></body></html> Qt::RichText @@ -381,7 +224,7 @@ - + ....................... @@ -409,61 +252,113 @@ - - - - - 0 - 0 - + + + + Qt::Vertical - - - 20 - 40 - + + + + + + Qt::Vertical - - - 20 - 40 - + + + + + + Qt::Vertical - - background-color: rgb(159, 107, 0) + + + + + + Qt::Vertical - - + + + + + + Qt::Vertical - - - - - 0 - 0 - + + + + Qt::Vertical - - - 20 - 40 - + + + + + + Qt::Vertical - - - 20 - 40 - + + + + + + Qt::Vertical - - + + + + + + Qt::Vertical - - + + + + Qt::Vertical + + + + + + + Qt::Vertical + + + + + + + Qt::Vertical + + + + + + + Qt::Vertical + + + + + + + Qt::Vertical + + + + + + + Qt::Vertical + + + + + 0 @@ -473,137 +368,176 @@ 20 - 40 + 20 20 - 40 + 20 - - background-color: rgb(1, 131, 31) - + + :/images/description.svg + - - + + - + 0 0 - 20 - 40 + 50 + 0 - - - 20 - 40 - + + <html><head/><body><p><span style=" font-weight:600;">Games</span></p></body></html> - - background-color: rgb(189, 0, 183) + + Qt::RichText + + Qt::AlignCenter + + + + + + + Qt::AlignCenter + - - - - - 0 - 0 - - + + - 20 - 40 + 120 + 0 - - - 20 - 40 - + + <html><head/><body><p><span style=" font-weight:600;">Custom Name</span></p></body></html> - - background-color: rgb(248, 245, 10) + + Qt::RichText + + + Qt::AlignCenter + + + + + + Qt::AlignCenter + - - - - - 0 - 0 - + + + + Qt::Vertical + + + + - 20 + 0 40 - + + background-color: rgb(162, 179, 73); +font: 57 10pt "Roboto Medium"; + + + + + + Qt::AlignCenter + + + + + + - 20 + 0 40 - background-color: rgb(254, 136, 197) + background-color: rgb(254, 136, 197); +font: 57 10pt "Roboto Medium"; + + Qt::AlignCenter + - - - - - 0 - 0 - + + + + - - - 20 - 40 - + + Qt::AlignCenter - - - 20 - 40 - + + + + + + - - background-color: rgb(255, 105, 0) + + Qt::AlignCenter + + + + + + + + + + Qt::AlignCenter + + + + + + Qt::AlignCenter + - - + + 0 @@ -613,25 +547,28 @@ 20 - 40 + 20 20 - 40 + 20 - - background-color: rgb(48, 116, 249) - + + :/images/note.svg + + + Qt::AlignCenter + - - + + 0 @@ -641,163 +578,289 @@ 20 - 40 + 20 20 - 40 + 20 - - background-color: rgb(102, 255, 192) - - - - - - - + + :/images/note.svg Qt::AlignCenter - - - - - 0 - 0 - - + + - 20 - 40 - - - - - 20 + 0 40 - background-color: rgb(162, 179, 73) + background-color: rgb(1, 131, 31); +font: 57 10pt "Roboto Medium"; + + Qt::AlignCenter + - - - + + + + Qt::Horizontal + + + + + + - - - Racist + + + + 0 + 0 + - - + + + 30 + 30 + - - :/images/racist.png + + + 30 + 30 + - - Qt::AlignCenter + + <html><head/><body><p><span style=" font-size:8pt;">Stratz smurf</span></p></body></html> + + + border-image: url(:/images/smurf.png); +color: rgb(255, 0, 0); +font: 20pt "Arial"; + + + 1 - - - Sexist - + - - :/images/sexist.png - Qt::AlignCenter + + + + + + - + + + + 0 + 0 + + + + + 30 + 30 + + - 24 - 24 + 30 + 30 - Toxic + <html><head/><body><p><span style=" font-size:8pt;">Stratz smurf</span></p></body></html> - - + + border-image: url(:/images/smurf.png); +color: rgb(255, 0, 0); +font: 20pt "Arial"; - - :/images/toxic.png + + 1 - - true + + + + + + Qt::AlignCenter + + + + + + - + + + + 0 + 0 + + + + + 30 + 30 + + + + + 30 + 30 + + - Feeder + <html><head/><body><p><span style=" font-size:8pt;">Stratz smurf</span></p></body></html> + + + border-image: url(:/images/smurf.png); +color: rgb(255, 0, 0); +font: 20pt "Arial"; - + 1 - - :/images/feeder.png + + + + + + Qt::AlignCenter + + + + + + - + + + + 0 + 0 + + + + + 30 + 30 + + + + + 30 + 30 + + - Gives Up + <html><head/><body><p><span style=" font-size:8pt;">Stratz smurf</span></p></body></html> + + + border-image: url(:/images/smurf.png); +color: rgb(255, 0, 0); +font: 20pt "Arial"; - + 1 - - :/images/givesup.png + + + + + + Qt::AlignCenter + + + + + + - + + + + 0 + 0 + + + + + 30 + 30 + + + + + 30 + 30 + + - Destroys Items + <html><head/><body><p><span style=" font-size:8pt;">Stratz smurf</span></p></body></html> + + + border-image: url(:/images/smurf.png); +color: rgb(255, 0, 0); +font: 20pt "Arial"; - + 1 - - :/images/destroyer.png + + + + + + Qt::AlignCenter @@ -807,11 +870,11 @@ - - - + + + - + Racist @@ -827,7 +890,7 @@ - + Sexist @@ -843,7 +906,7 @@ - + 24 @@ -868,7 +931,7 @@ - + Feeder @@ -884,7 +947,7 @@ - + Gives Up @@ -900,7 +963,7 @@ - + Destroys Items @@ -918,109 +981,96 @@ - - - - - - - Racist - - - - - - :/images/racist.png - - - Qt::AlignCenter - - - + + + - - - Sexist - - - - - - :/images/sexist.png + + + + 0 + 0 + - - Qt::AlignCenter + + + 30 + 30 + - - - - - 24 - 24 + 30 + 30 - Toxic - - - + <html><head/><body><p><span style=" font-size:8pt;">Stratz smurf</span></p></body></html> - - :/images/toxic.png - - - true + + border-image: url(:/images/smurf.png); +color: rgb(255, 0, 0); +font: 20pt "Arial"; - - Qt::AlignCenter + + 1 - - - Feeder - + - - :/images/feeder.png - Qt::AlignCenter + + + + + + - - - Gives Up + + + + 0 + 0 + - - + + + 30 + 30 + - - :/images/givesup.png + + + 30 + 30 + - - Qt::AlignCenter + + <html><head/><body><p><span style=" font-size:8pt;">Stratz smurf</span></p></body></html> + + + border-image: url(:/images/smurf.png); +color: rgb(255, 0, 0); +font: 20pt "Arial"; + + + 1 - - - Destroys Items - + - - :/images/destroyer.png - Qt::AlignCenter @@ -1029,17 +1079,11 @@ - - - + + + - - - - 24 - 24 - - + Racist @@ -1049,10 +1093,13 @@ :/images/racist.png + + Qt::AlignCenter + - + Sexist @@ -1062,19 +1109,13 @@ :/images/sexist.png + + Qt::AlignCenter + - - - true - - - - 0 - 0 - - + 24 @@ -1099,7 +1140,7 @@ - + Feeder @@ -1115,7 +1156,7 @@ - + Gives Up @@ -1131,7 +1172,7 @@ - + Destroys Items @@ -1149,11 +1190,60 @@ - - - + + + - + + + + 0 + 0 + + + + + 30 + 30 + + + + + 30 + 30 + + + + <html><head/><body><p><span style=" font-size:8pt;">Stratz smurf</span></p></body></html> + + + border-image: url(:/images/smurf.png); +color: rgb(255, 0, 0); +font: 20pt "Arial"; + + + 1 + + + + + + + + + + Qt::AlignCenter + + + + + + + + + + + Racist @@ -1169,7 +1259,7 @@ - + Sexist @@ -1185,7 +1275,7 @@ - + 24 @@ -1210,7 +1300,7 @@ - + Feeder @@ -1226,7 +1316,7 @@ - + Gives Up @@ -1242,7 +1332,7 @@ - + Destroys Items @@ -1260,7 +1350,7 @@ - + @@ -1371,11 +1461,11 @@ - - - + + + - + Racist @@ -1391,7 +1481,7 @@ - + Sexist @@ -1407,7 +1497,7 @@ - + 24 @@ -1432,7 +1522,7 @@ - + Feeder @@ -1448,7 +1538,7 @@ - + Gives Up @@ -1464,7 +1554,7 @@ - + Destroys Items @@ -1482,11 +1572,11 @@ - - - + + + - + Racist @@ -1502,7 +1592,7 @@ - + Sexist @@ -1518,7 +1608,7 @@ - + 24 @@ -1543,7 +1633,7 @@ - + Feeder @@ -1559,7 +1649,7 @@ - + Gives Up @@ -1575,7 +1665,7 @@ - + Destroys Items @@ -1593,11 +1683,60 @@ - - - + + + - + + + + 0 + 0 + + + + + 30 + 30 + + + + + 30 + 30 + + + + <html><head/><body><p><span style=" font-size:8pt;">Stratz smurf</span></p></body></html> + + + border-image: url(:/images/smurf.png); +color: rgb(255, 0, 0); +font: 20pt "Arial"; + + + 1 + + + + + + + + + + Qt::AlignCenter + + + + + + + + + + + Racist @@ -1613,7 +1752,7 @@ - + Sexist @@ -1629,7 +1768,7 @@ - + 24 @@ -1654,7 +1793,7 @@ - + Feeder @@ -1670,7 +1809,7 @@ - + Gives Up @@ -1686,7 +1825,7 @@ - + Destroys Items @@ -1704,11 +1843,17 @@ - - - + + + - + + + + 24 + 24 + + Racist @@ -1718,13 +1863,10 @@ :/images/racist.png - - Qt::AlignCenter - - + Sexist @@ -1734,13 +1876,19 @@ :/images/sexist.png - - Qt::AlignCenter - - + + + true + + + + 0 + 0 + + 24 @@ -1765,7 +1913,7 @@ - + Feeder @@ -1781,7 +1929,7 @@ - + Gives Up @@ -1797,7 +1945,7 @@ - + Destroys Items @@ -1815,126 +1963,366 @@ - - - - 99999 - - - Qt::AlignCenter - - - - - - - 99999 - - - Qt::AlignCenter - - - - - - - - 0 - 40 - - - - - - - - - - - 99999 - - - Qt::AlignCenter - - - - - - - - - - Qt::AlignCenter - - - - - - - - - - Qt::AlignCenter - - - - - - - - - - Qt::AlignCenter - - - - - - - - - - Qt::AlignCenter - - - - - - - - - - Qt::AlignCenter - - - - - - - - 0 - 0 - + + + + + + + Racist + + + + + + :/images/racist.png + + + Qt::AlignCenter + + + + + + + Sexist + + + + + + :/images/sexist.png + + + Qt::AlignCenter + + + + + + + + 24 + 24 + + + + Toxic + + + + + + :/images/toxic.png + + + true + + + Qt::AlignCenter + + + + + + + Feeder + + + + + + :/images/feeder.png + + + Qt::AlignCenter + + + + + + + Gives Up + + + + + + :/images/givesup.png + + + Qt::AlignCenter + + + + + + + Destroys Items + + + + + + :/images/destroyer.png + + + Qt::AlignCenter + + + + + + + + + + + + + + 0 + 0 + + + + + 30 + 30 + + + + + 30 + 30 + + + + <html><head/><body><p><span style=" font-size:8pt;">Stratz smurf</span></p></body></html> + + + border-image: url(:/images/smurf.png); +color: rgb(255, 0, 0); +font: 20pt "Arial"; + + + 1 + + + + + + + + + + Qt::AlignCenter + + + + + + + + + + + + + Racist + + + + + + :/images/racist.png + + + Qt::AlignCenter + + + + + + + Sexist + + + + + + :/images/sexist.png + + + Qt::AlignCenter + + + + + + + + 24 + 24 + + + + Toxic + + + + + + :/images/toxic.png + + + true + + + Qt::AlignCenter + + + + + + + Feeder + + + + + + :/images/feeder.png + + + Qt::AlignCenter + + + + + + + Gives Up + + + + + + :/images/givesup.png + + + Qt::AlignCenter + + + + + + + Destroys Items + + + + + + :/images/destroyer.png + + + Qt::AlignCenter + + + + + + + + + + Qt::Vertical - - - 100 - 0 - + + + + + + Qt::Vertical + + + + + + + Qt::Vertical + + + + + + + Qt::Vertical + + + + + + + Qt::Vertical + + + + + + + Qt::Vertical + + + + + + + Qt::Vertical + + + + + + + Qt::Vertical + + + + + + + Qt::Vertical + + + + + + + Qt::Vertical + + + + + + + Qt::Vertical + + + + - <html><head/><body><p><span style=" font-weight:600;">Smurf</span></p></body></html> - - - Qt::RichText + Qt::AlignCenter - - + + @@ -1943,8 +2331,8 @@ - - + + @@ -1953,263 +2341,372 @@ - - + + + + + 0 + 0 + + - 0 - 40 + 40 + 30 + + + + + 40 + 30 + + true + + + Qt::AlignCenter + - - + + - 99999 + Qt::AlignCenter - - + + + + + 0 + 0 + + - 0 - 40 + 40 + 30 + + + + + 40 + 30 + + true + + + Qt::AlignCenter + - - + + + + + 0 + 0 + + - 0 - 40 + 40 + 30 + + + + + 40 + 30 + + true + + + Qt::AlignCenter + - - + + + + + 0 + 0 + + - 0 - 40 + 40 + 30 + + + + + 40 + 30 - - - - - - 99999 + + true Qt::AlignCenter - - + + - 99999 + + + + :/images/public.svg Qt::AlignCenter - - + + + + + 0 + 0 + + - 0 - 40 + 40 + 30 + + + + + 40 + 30 - - - - - - 99999 + + true Qt::AlignCenter - - + + + + + 0 + 0 + + - 0 - 40 + 40 + 30 + + + + + 40 + 30 + + true + + + Qt::AlignCenter + - - + + - + 0 0 - 50 - 0 + 40 + 30 + + + + + 40 + 30 - <html><head/><body><p><span style=" font-weight:600;">Games</span></p></body></html> + - - Qt::RichText + + true - - Qt::AlignCenter + + false - - + + + + + 0 + 0 + + - 0 - 40 + 40 + 30 - - - - - - - - + - 160 - 40 + 40 + 30 - <html><head/><body><p><span style=" font-weight:600;">Name</span></p></body></html> + - - Qt::RichText + + true Qt::AlignCenter - - - - 99999 + + + + + 0 + 0 + - - Qt::AlignCenter + + + 40 + 30 + + + + + 40 + 30 + - - - - - - Qt::AlignCenter - - - - - - - 99999 + + true Qt::AlignCenter - - - - 99999 - - - Qt::AlignCenter + + + + + 0 + 0 + - - - - - 0 - 40 + 40 + 30 + + + + + 40 + 30 + + true + + + Qt::AlignCenter + - - - - - 0 - 40 - + + + + Qt::Vertical + + + + + + Qt::AlignCenter + - - + + - Qt::Horizontal + Qt::Vertical - - + + - Qt::Horizontal + Qt::Vertical - - + + @@ -2218,30 +2715,28 @@ - - - - - 0 - 0 - - + + - 140 - 0 + 0 + 40 + + background-color: rgb(248, 245, 10); +font: 57 10pt "Roboto Medium"; + - <html><head/><body><p><span style=" font-weight:600;">Flags</span></p></body></html> + Qt::AlignCenter - - + + 0 @@ -2251,25 +2746,28 @@ 20 - 40 + 20 20 - 40 + 20 - - background-color: rgb(99, 218, 250) - + + :/images/note.svg + + + Qt::AlignCenter + - - + + 0 @@ -2279,190 +2777,275 @@ 20 - 40 + 20 20 - 40 + 20 + + :/images/note.svg + + + Qt::AlignCenter + - - + + + + Qt::Vertical + + + + + + + Qt::Vertical + + + + + - + 0 0 - 20 - 40 + 30 + 0 - 20 - 40 + 30 + 16777215 - - background-color: rgb(48, 116, 249) + + <html><head/><body><p><span style=" font-weight:600;">LVL</span></p></body></html> + + + Qt::AlignCenter + + + + + + + Qt::Vertical + + + + + + + Qt::Vertical + + + + + + + Qt::Vertical + + + + + + Qt::AlignCenter + - - - - - 0 - 0 - + + + + Qt::Vertical - - - 20 - 40 - + + + + + + - - - 20 - 40 - + + Qt::AlignCenter - - background-color: rgb(102, 255, 192) + + + + + + Qt::Vertical + + + + + + Qt::AlignCenter + - - + + - + 0 0 - 20 - 40 + 140 + 0 - - - 20 - 40 - + + <html><head/><body><p><span style=" font-weight:600;">Flags</span></p></body></html> - - background-color: rgb(189, 0, 183) + + Qt::AlignCenter - - + + + + + + Qt::Vertical - - + + - + 0 0 - 20 - 40 + 100 + 0 - - - 20 - 40 - + + <html><head/><body><p><span style=" font-weight:600;">Smurf</span></p></body></html> - - background-color: rgb(248, 245, 10) + + Qt::RichText + + Qt::AlignCenter + + + + + + + Qt::AlignCenter + - - - - - 0 - 0 - + + + + Qt::Horizontal + + + + - 20 + 160 40 - - - 20 - 40 - + + <html><head/><body><p><span style=" font-weight:600;">Name</span></p></body></html> - - background-color: rgb(255, 105, 0) + + Qt::RichText + + + Qt::AlignCenter + + + + + + Qt::AlignCenter + - - - - - 0 - 0 - - + + - 20 + 0 40 - + + background-color: rgb(48, 116, 249); +font: 57 10pt "Roboto Medium"; + + + + + + Qt::AlignCenter + + + + + + - 20 + 0 40 - background-color: rgb(254, 136, 197) + background-color: rgb(189, 0, 183); +font: 57 10pt "Roboto Medium"; + + Qt::AlignCenter + - - + + 0 @@ -2472,109 +3055,177 @@ 20 - 40 + 20 20 - 40 + 20 - - background-color: rgb(162, 179, 73) - + + :/images/note.svg + + + Qt::AlignCenter + - - - - - 0 - 0 - - + + - 20 - 40 + 120 + 0 - + + <html><head/><body><p><span style=" font-weight:600;">Pro Name</span></p></body></html> + + + Qt::RichText + + + Qt::AlignCenter + + + + + + + + + + Qt::AlignCenter + + + + + + - 20 + 0 40 - background-color: rgb(99, 218, 250) + background-color: rgb(102, 255, 192); +font: 57 10pt "Roboto Medium"; + + Qt::AlignCenter + - - - - - 0 - 0 - + + + + - - - 20 - 40 - + + Qt::AlignCenter - - - 20 - 40 - + + + + + + - - background-color: rgb(1, 131, 31) + + Qt::AlignCenter + + + + + + + + + + Qt::AlignCenter + + + + + + Qt::AlignCenter + - - - - - 0 - 0 - + + + + - - - 20 - 40 - + + Qt::AlignCenter - + + + + + + + + + Qt::AlignCenter + + + + + + + + + + Qt::AlignCenter + + + + + + + + + + Qt::AlignCenter + + + + + + - 20 + 0 40 - background-color: rgb(159, 107, 0) + background-color: rgb(255, 105, 0); +font: 57 10pt "Roboto Medium"; + + Qt::AlignCenter + - - + + @@ -2583,8 +3234,8 @@ - - + + @@ -2593,18 +3244,18 @@ - - + + - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + Qt::AlignCenter - - + + @@ -2613,58 +3264,121 @@ - - + + + + + 0 + 0 + + + + + 20 + 20 + + + + + 20 + 20 + + + + :/images/note.svg + - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + Qt::AlignCenter - - + + + + + 0 + 0 + + + + + 20 + 20 + + + + + 20 + 20 + + + + :/images/note.svg + Qt::AlignCenter - - + + - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + Qt::AlignCenter - - + + + + + 0 + 0 + + + + + 20 + 20 + + + + + 20 + 20 + + + + :/images/note.svg + Qt::AlignCenter - - + + - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + Qt::AlignCenter - - + + @@ -2673,38 +3387,69 @@ - - + + - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + Qt::AlignCenter - - + + + + + 0 + 0 + + + + + 20 + 20 + + + + + 20 + 20 + + + + :/images/note.svg + Qt::AlignCenter - - + + + + + 0 + 40 + + + + background-color: rgb(159, 107, 0); +font: 57 10pt "Roboto Medium"; + - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + Qt::AlignCenter - - + + @@ -2713,18 +3458,49 @@ - - + + + + + 0 + 0 + + + + + 20 + 20 + + + + + 20 + 20 + + + + :/images/note.svg + - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + Qt::AlignCenter - - + + + + + 0 + 40 + + + + background-color: rgb(99, 218, 250); +font: 57 10pt "Roboto Medium"; + @@ -2733,18 +3509,22 @@ - - - - + + + + Qt::Vertical - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + Qt::Vertical - - + + @@ -2753,61 +3533,43 @@ - - + + - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + Qt::AlignCenter - - - - - 120 - 0 - - + + - <html><head/><body><p><span style=" font-weight:600;">Custom Name</span></p></body></html> - - - Qt::RichText + Qt::AlignCenter - - - - - 120 - 0 - - + + - <html><head/><body><p><span style=" font-weight:600;">Pro Name</span></p></body></html> - - - Qt::RichText + Qt::AlignCenter - - + + - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + Qt::AlignCenter @@ -2835,30 +3597,8 @@ - + - - - - - - - 50 - 16777215 - - - - Qt::LeftToRight - - - Save - - - - - - - @@ -2893,6 +3633,9 @@ + + Decides to run on ennemies to feed. + Feeder @@ -2900,6 +3643,9 @@ + + Decides to not play the game anymore, saying gg and afk. + Gives Up @@ -2907,6 +3653,9 @@ + + Decides to destroy his items. + Destroys Items @@ -2915,18 +3664,27 @@ - - - - Qt::Vertical - - - - 20 - 40 - - - + + + + + + + + 50 + 16777215 + + + + Qt::LeftToRight + + + Save + + + + + @@ -2941,10 +3699,30 @@ - - + + - <html><head/><body><p><span style=" font-weight:600;">In Game Name</span></p></body></html> + + + + + + + + <html><head/><body><p><span style=" font-weight:600;">Pro Name</span></p></body></html> + + + Qt::RichText + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + <html><head/><body><p><span style=" font-weight:600;">Smurf</span></p></body></html> Qt::RichText @@ -2954,6 +3732,19 @@ + + + + Qt::Vertical + + + + 20 + 40 + + + + @@ -2961,10 +3752,33 @@ - - + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + - <html><head/><body><p><span style=" font-weight:600;">Smurf</span></p></body></html> + <html><head/><body><p><span style=" font-weight:600;">In Game Name</span></p></body></html> Qt::RichText @@ -2974,17 +3788,10 @@ - - - - - - - - + - <html><head/><body><p><span style=" font-weight:600;">Pro Name</span></p></body></html> + <html><head/><body><p><span style=" font-weight:600;">Custom Name</span></p></body></html> Qt::RichText @@ -2994,13 +3801,13 @@ - + - - + + - <html><head/><body><p><span style=" font-weight:600;">Custom Name</span></p></body></html> + <html><head/><body><p><span style=" font-weight:600;">Note</span></p></body></html> Qt::RichText @@ -3011,52 +3818,50 @@ - - - - - + + + false + + + + 9 + - - - - Qt::Vertical + + + + <html><head/><body><p><span style=" font-weight:600;">Games</span></p></body></html> - - - 20 - 40 - + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - + - - + + - <html><head/><body><p><span style=" font-weight:600;">Note</span></p></body></html> + - - Qt::RichText + + + + + + <html><head/><body><p><span style=" font-weight:600;">Stratz Smurf</span></p></body></html> Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - false - - + + + - - 9 - @@ -3098,54 +3903,14 @@ - - - - <html><head/><body><p><span style=" font-style:italic;">You can request one for free using the </span><a href="https://steamcommunity.com/dev/apikey"><span style=" text-decoration: underline; color:#0000ff;">Steam API Key Form</span></a><span style=" font-style:italic;">. </span></p></body></html> - - - - - - - <html><head/><body><p><span style=" font-weight:600;">Steam Username</span></p></body></html> - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - QLineEdit::Password - - - - - - - <html><head/><body><p><span style=" font-weight:600;">Steam Web API Key</span></p></body></html> - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - + + - <html><head/><body><p><span style=" font-style:italic;">In this mode, the software creates a fake Dota client using the provided Steam username and password (use another account than the one you are playing on) to find the server the searched player is on.<br/>Then, it uses Valve Web API to find the match information.</span></p></body></html> - - - Qt::AlignCenter - - - true + <html><head/><body><p><span style=" font-style:italic;">The software use Game State Integration (GSI) to understand which game you are in (or spectating). To enable it, you need to add the file </span><a href="https://github.com/Philaeux/DotaNotes/blob/main/src/dota_notes/ui/gamestate_integration_notes.cfg"><span style=" text-decoration: underline; color:#0000ff;">https://github.com/Philaeux/DotaNotes/blob/main/src/dota_notes/ui/gamestate_integration_notes.cfg</span></a><span style=" font-style:italic;"> at:</span></p><p><span style=" font-style:italic;">...\Steam\steamapps\common\dota 2 beta\game\dota\cfg\gamestate_integration\gamestate_integration_notes.cfg</span></p></body></html> - + @@ -3191,18 +3956,11 @@ - - - - QLineEdit::Password - - - - - - + + + - + Qt::Horizontal @@ -3215,14 +3973,17 @@ - + - <html><head/><body><p><span style=" font-weight:600;">Mode Client</span></p></body></html> + <html><head/><body><p><span style=" font-weight:600;">General</span></p></body></html> + + + Qt::AlignCenter - + Qt::Horizontal @@ -3237,192 +3998,27 @@ - - - - <html><head/><body><p><span style=" font-style:italic;">Use a different Steam Account than the one you are playing on !</span></p></body></html> - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - + + - <html><head/><body><p><span style=" font-weight:600;">Steam Password</span></p></body></html> + <html><head/><body><p><span style=" font-weight:600;">Stratz Token</span></p></body></html> Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - <html><head/><body><p><span style=" font-style:italic;">Game State Integration (GSI) shows the information of the current game when you spectate it.</span></p><p><span style=" font-style:italic;">To enable it, you need to add </span><a href="aaa"><span style=" text-decoration: underline; color:#0000ff;">this file</span></a><span style=" font-style:italic;"> at:</span></p><p><span style=" font-style:italic;">...\Steam\steamapps\common\dota 2 beta\game\dota\cfg\gamestate_integration\gamestate_integration_notes.cfg</span></p></body></html> - - - - - + + QLineEdit::Password - - - - <html><head/><body><p><span style=" font-style:italic;">Ask for one or setup your own proxy server.</span></p></body></html> - - - - - - - https://dota-notes.the-cluster.org - - - - - - - <html><head/><body><p><span style=" font-style:italic;">Change the server only if you know what you are doing.</span></p></body></html> - - - - - - - - - - <html><head/><body><p><span style=" font-weight:600;">Mode</span></p></body></html> - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - <html><head/><body><p><span style=" font-weight:600;">API Key</span></p></body></html> - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - <html><head/><body><p><span style=" font-style:italic;">In this mode, the software uses a remote server to do the Dota Client and Steam API requests. Use it if you set up your own server or if you got an API Key.</span></p></body></html> - - - Qt::AlignCenter - - - - - - - <html><head/><body><p><span style=" font-weight:600;">Proxy URL</span></p></body></html> - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - <html><head/><body><p><span style=" font-weight:600;">Mode Proxy Server</span></p></body></html> - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - <html><head/><body><p><span style=" font-weight:600;">General</span></p></body></html> - - - Qt::AlignCenter - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - + + - Use GSI to show players when spectating games + <html><head/><body><p>Get one for free at <a href="https://stratz.com/api"><span style=" text-decoration: underline; color:#0000ff;">https://stratz.com/api</span></a></p></body></html>