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 @@
+
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>