From ed1dd8194f55be05ba054da1698bc649f60eab83 Mon Sep 17 00:00:00 2001 From: Vincent 'Philaeux' Lamotte Date: Mon, 14 Aug 2023 21:12:21 +0200 Subject: [PATCH] Move away from Steam client to full Stratz client - A stratz token is necessary for the app to work - GSI is necessary for the app to work - Get game info from Stratz live graphql - Get player info from Stratz player graphql - Detect last game with Stratz instead of Opendota - Added player account level and country code --- .gitignore | 2 +- src/Makefile | 6 +- src/dota_notes/app_dota.py | 78 - src/dota_notes/app_flask.py | 34 +- src/dota_notes/data/messages.py | 48 +- src/dota_notes/data/models/__init__.py | 0 src/dota_notes/data/models/base_entity.py | 6 + src/dota_notes/data/models/database.py | 41 + .../{models.py => models/player_entity.py} | 79 +- src/dota_notes/data/models/settings_entity.py | 23 + src/dota_notes/data/settings.py | 21 +- src/dota_notes/data/states.py | 145 - src/dota_notes/data/states/__init__.py | 0 src/dota_notes/data/states/game_state.py | 131 + src/dota_notes/data/states/player_state.py | 62 + src/dota_notes/dota_notes.py | 16 +- src/dota_notes/helpers.py | 395 +- src/dota_notes/ui/app_qt.py | 135 +- src/dota_notes/ui/fonts/Roboto-Medium.ttf | Bin 0 -> 168644 bytes src/dota_notes/ui/images/description.svg | 1 + src/dota_notes/ui/images/download.svg | 1 + src/dota_notes/ui/images/flags/ac.svg | 76 + src/dota_notes/ui/images/flags/ad.svg | 150 + src/dota_notes/ui/images/flags/ae.svg | 6 + src/dota_notes/ui/images/flags/af.svg | 81 + src/dota_notes/ui/images/flags/ag.svg | 14 + src/dota_notes/ui/images/flags/ai.svg | 29 + src/dota_notes/ui/images/flags/al.svg | 5 + src/dota_notes/ui/images/flags/am.svg | 5 + src/dota_notes/ui/images/flags/ao.svg | 13 + src/dota_notes/ui/images/flags/aq.svg | 5 + src/dota_notes/ui/images/flags/ar.svg | 32 + src/dota_notes/ui/images/flags/arab.svg | 109 + src/dota_notes/ui/images/flags/as.svg | 72 + src/dota_notes/ui/images/flags/at.svg | 6 + src/dota_notes/ui/images/flags/au.svg | 8 + src/dota_notes/ui/images/flags/aw.svg | 186 + src/dota_notes/ui/images/flags/ax.svg | 18 + src/dota_notes/ui/images/flags/az.svg | 8 + src/dota_notes/ui/images/flags/ba.svg | 12 + src/dota_notes/ui/images/flags/bb.svg | 6 + src/dota_notes/ui/images/flags/bd.svg | 4 + src/dota_notes/ui/images/flags/be.svg | 7 + src/dota_notes/ui/images/flags/bf.svg | 7 + src/dota_notes/ui/images/flags/bg.svg | 7 + src/dota_notes/ui/images/flags/bh.svg | 4 + src/dota_notes/ui/images/flags/bi.svg | 15 + src/dota_notes/ui/images/flags/bj.svg | 14 + src/dota_notes/ui/images/flags/bl.svg | 5 + src/dota_notes/ui/images/flags/bm.svg | 97 + src/dota_notes/ui/images/flags/bn.svg | 36 + src/dota_notes/ui/images/flags/bo.svg | 676 ++++ src/dota_notes/ui/images/flags/bq.svg | 5 + src/dota_notes/ui/images/flags/br.svg | 45 + src/dota_notes/ui/images/flags/bs.svg | 13 + src/dota_notes/ui/images/flags/bt.svg | 89 + src/dota_notes/ui/images/flags/bv.svg | 13 + src/dota_notes/ui/images/flags/bw.svg | 7 + src/dota_notes/ui/images/flags/by.svg | 20 + src/dota_notes/ui/images/flags/bz.svg | 145 + src/dota_notes/ui/images/flags/ca.svg | 4 + src/dota_notes/ui/images/flags/cc.svg | 19 + src/dota_notes/ui/images/flags/cd.svg | 5 + src/dota_notes/ui/images/flags/cefta.svg | 13 + src/dota_notes/ui/images/flags/cf.svg | 15 + src/dota_notes/ui/images/flags/cg.svg | 12 + src/dota_notes/ui/images/flags/ch.svg | 9 + src/dota_notes/ui/images/flags/ci.svg | 7 + src/dota_notes/ui/images/flags/ck.svg | 9 + src/dota_notes/ui/images/flags/cl.svg | 13 + src/dota_notes/ui/images/flags/cm.svg | 15 + src/dota_notes/ui/images/flags/cn.svg | 11 + src/dota_notes/ui/images/flags/co.svg | 7 + src/dota_notes/ui/images/flags/cp.svg | 7 + src/dota_notes/ui/images/flags/cr.svg | 7 + src/dota_notes/ui/images/flags/cu.svg | 13 + src/dota_notes/ui/images/flags/cv.svg | 13 + src/dota_notes/ui/images/flags/cw.svg | 14 + src/dota_notes/ui/images/flags/cx.svg | 15 + src/dota_notes/ui/images/flags/cy.svg | 6 + src/dota_notes/ui/images/flags/cz.svg | 5 + src/dota_notes/ui/images/flags/de.svg | 5 + src/dota_notes/ui/images/flags/dg.svg | 130 + src/dota_notes/ui/images/flags/dj.svg | 13 + src/dota_notes/ui/images/flags/dk.svg | 5 + src/dota_notes/ui/images/flags/dm.svg | 152 + src/dota_notes/ui/images/flags/do.svg | 123 + src/dota_notes/ui/images/flags/dz.svg | 5 + src/dota_notes/ui/images/flags/eac.svg | 50 + src/dota_notes/ui/images/flags/ec.svg | 138 + src/dota_notes/ui/images/flags/ee.svg | 7 + src/dota_notes/ui/images/flags/eg.svg | 38 + src/dota_notes/ui/images/flags/eh.svg | 16 + src/dota_notes/ui/images/flags/er.svg | 8 + src/dota_notes/ui/images/flags/es-ct.svg | 4 + src/dota_notes/ui/images/flags/es-ga.svg | 187 + src/dota_notes/ui/images/flags/es-pv.svg | 5 + src/dota_notes/ui/images/flags/es.svg | 544 +++ src/dota_notes/ui/images/flags/et.svg | 14 + src/dota_notes/ui/images/flags/eu.svg | 28 + src/dota_notes/ui/images/flags/fi.svg | 5 + src/dota_notes/ui/images/flags/fj.svg | 120 + src/dota_notes/ui/images/flags/fk.svg | 90 + src/dota_notes/ui/images/flags/fm.svg | 11 + src/dota_notes/ui/images/flags/fo.svg | 12 + src/dota_notes/ui/images/flags/fr.svg | 5 + src/dota_notes/ui/images/flags/ga.svg | 7 + src/dota_notes/ui/images/flags/gb-eng.svg | 5 + src/dota_notes/ui/images/flags/gb-nir.svg | 132 + src/dota_notes/ui/images/flags/gb-sct.svg | 4 + src/dota_notes/ui/images/flags/gb-wls.svg | 9 + src/dota_notes/ui/images/flags/gb.svg | 7 + src/dota_notes/ui/images/flags/gd.svg | 27 + src/dota_notes/ui/images/flags/ge.svg | 6 + src/dota_notes/ui/images/flags/gf.svg | 5 + src/dota_notes/ui/images/flags/gg.svg | 9 + src/dota_notes/ui/images/flags/gh.svg | 6 + src/dota_notes/ui/images/flags/gi.svg | 32 + src/dota_notes/ui/images/flags/gl.svg | 4 + src/dota_notes/ui/images/flags/gm.svg | 14 + src/dota_notes/ui/images/flags/gn.svg | 7 + src/dota_notes/ui/images/flags/gp.svg | 5 + src/dota_notes/ui/images/flags/gq.svg | 23 + src/dota_notes/ui/images/flags/gr.svg | 16 + src/dota_notes/ui/images/flags/gs.svg | 133 + src/dota_notes/ui/images/flags/gt.svg | 204 ++ src/dota_notes/ui/images/flags/gu.svg | 23 + src/dota_notes/ui/images/flags/gw.svg | 13 + src/dota_notes/ui/images/flags/gy.svg | 9 + src/dota_notes/ui/images/flags/hk.svg | 8 + src/dota_notes/ui/images/flags/hm.svg | 8 + src/dota_notes/ui/images/flags/hn.svg | 18 + src/dota_notes/ui/images/flags/hr.svg | 58 + src/dota_notes/ui/images/flags/ht.svg | 116 + src/dota_notes/ui/images/flags/hu.svg | 7 + src/dota_notes/ui/images/flags/ic.svg | 7 + src/dota_notes/ui/images/flags/id.svg | 4 + src/dota_notes/ui/images/flags/ie.svg | 7 + src/dota_notes/ui/images/flags/il.svg | 14 + src/dota_notes/ui/images/flags/im.svg | 36 + src/dota_notes/ui/images/flags/in.svg | 25 + src/dota_notes/ui/images/flags/io.svg | 130 + src/dota_notes/ui/images/flags/iq.svg | 10 + src/dota_notes/ui/images/flags/ir.svg | 219 ++ src/dota_notes/ui/images/flags/is.svg | 12 + src/dota_notes/ui/images/flags/it.svg | 7 + src/dota_notes/ui/images/flags/je.svg | 45 + src/dota_notes/ui/images/flags/jm.svg | 8 + src/dota_notes/ui/images/flags/jo.svg | 16 + src/dota_notes/ui/images/flags/jp.svg | 11 + src/dota_notes/ui/images/flags/ke.svg | 23 + src/dota_notes/ui/images/flags/kg.svg | 15 + src/dota_notes/ui/images/flags/kh.svg | 61 + src/dota_notes/ui/images/flags/ki.svg | 36 + src/dota_notes/ui/images/flags/km.svg | 16 + src/dota_notes/ui/images/flags/kn.svg | 14 + src/dota_notes/ui/images/flags/kp.svg | 15 + src/dota_notes/ui/images/flags/kr.svg | 24 + src/dota_notes/ui/images/flags/kw.svg | 13 + src/dota_notes/ui/images/flags/ky.svg | 103 + src/dota_notes/ui/images/flags/kz.svg | 36 + src/dota_notes/ui/images/flags/la.svg | 12 + src/dota_notes/ui/images/flags/lb.svg | 15 + src/dota_notes/ui/images/flags/lc.svg | 8 + src/dota_notes/ui/images/flags/li.svg | 43 + src/dota_notes/ui/images/flags/lk.svg | 22 + src/dota_notes/ui/images/flags/lr.svg | 14 + src/dota_notes/ui/images/flags/ls.svg | 8 + src/dota_notes/ui/images/flags/lt.svg | 7 + src/dota_notes/ui/images/flags/lu.svg | 5 + src/dota_notes/ui/images/flags/lv.svg | 6 + src/dota_notes/ui/images/flags/ly.svg | 13 + src/dota_notes/ui/images/flags/ma.svg | 4 + src/dota_notes/ui/images/flags/mc.svg | 6 + src/dota_notes/ui/images/flags/md.svg | 70 + src/dota_notes/ui/images/flags/me.svg | 116 + src/dota_notes/ui/images/flags/mf.svg | 5 + src/dota_notes/ui/images/flags/mg.svg | 7 + src/dota_notes/ui/images/flags/mh.svg | 7 + src/dota_notes/ui/images/flags/mk.svg | 5 + src/dota_notes/ui/images/flags/ml.svg | 7 + src/dota_notes/ui/images/flags/mm.svg | 12 + src/dota_notes/ui/images/flags/mn.svg | 14 + src/dota_notes/ui/images/flags/mo.svg | 9 + src/dota_notes/ui/images/flags/mp.svg | 86 + src/dota_notes/ui/images/flags/mq.svg | 5 + src/dota_notes/ui/images/flags/mr.svg | 6 + src/dota_notes/ui/images/flags/ms.svg | 29 + src/dota_notes/ui/images/flags/mt.svg | 49 + src/dota_notes/ui/images/flags/mu.svg | 8 + src/dota_notes/ui/images/flags/mv.svg | 6 + src/dota_notes/ui/images/flags/mw.svg | 10 + src/dota_notes/ui/images/flags/mx.svg | 382 ++ src/dota_notes/ui/images/flags/my.svg | 26 + src/dota_notes/ui/images/flags/mz.svg | 21 + src/dota_notes/ui/images/flags/na.svg | 16 + src/dota_notes/ui/images/flags/nc.svg | 13 + src/dota_notes/ui/images/flags/ne.svg | 6 + src/dota_notes/ui/images/flags/nf.svg | 9 + src/dota_notes/ui/images/flags/ng.svg | 6 + src/dota_notes/ui/images/flags/ni.svg | 129 + src/dota_notes/ui/images/flags/nl.svg | 5 + src/dota_notes/ui/images/flags/no.svg | 7 + src/dota_notes/ui/images/flags/np.svg | 13 + src/dota_notes/ui/images/flags/nr.svg | 12 + src/dota_notes/ui/images/flags/nu.svg | 10 + src/dota_notes/ui/images/flags/nz.svg | 36 + src/dota_notes/ui/images/flags/om.svg | 115 + src/dota_notes/ui/images/flags/pa.svg | 14 + src/dota_notes/ui/images/flags/pe.svg | 4 + src/dota_notes/ui/images/flags/pf.svg | 19 + src/dota_notes/ui/images/flags/pg.svg | 9 + src/dota_notes/ui/images/flags/ph.svg | 6 + src/dota_notes/ui/images/flags/pk.svg | 15 + src/dota_notes/ui/images/flags/pl.svg | 6 + src/dota_notes/ui/images/flags/pm.svg | 5 + src/dota_notes/ui/images/flags/pn.svg | 53 + src/dota_notes/ui/images/flags/pr.svg | 13 + src/dota_notes/ui/images/flags/ps.svg | 15 + src/dota_notes/ui/images/flags/pt.svg | 57 + src/dota_notes/ui/images/flags/pw.svg | 11 + src/dota_notes/ui/images/flags/py.svg | 157 + src/dota_notes/ui/images/flags/qa.svg | 4 + src/dota_notes/ui/images/flags/re.svg | 5 + src/dota_notes/ui/images/flags/ro.svg | 7 + src/dota_notes/ui/images/flags/rs.svg | 292 ++ src/dota_notes/ui/images/flags/ru.svg | 7 + src/dota_notes/ui/images/flags/rw.svg | 13 + src/dota_notes/ui/images/flags/sa.svg | 25 + src/dota_notes/ui/images/flags/sb.svg | 13 + src/dota_notes/ui/images/flags/sc.svg | 7 + src/dota_notes/ui/images/flags/sd.svg | 13 + src/dota_notes/ui/images/flags/se.svg | 4 + src/dota_notes/ui/images/flags/sg.svg | 13 + src/dota_notes/ui/images/flags/sh.svg | 76 + src/dota_notes/ui/images/flags/si.svg | 18 + src/dota_notes/ui/images/flags/sj.svg | 7 + src/dota_notes/ui/images/flags/sk.svg | 9 + src/dota_notes/ui/images/flags/sl.svg | 7 + src/dota_notes/ui/images/flags/sm.svg | 75 + src/dota_notes/ui/images/flags/sn.svg | 8 + src/dota_notes/ui/images/flags/so.svg | 11 + src/dota_notes/ui/images/flags/sr.svg | 6 + src/dota_notes/ui/images/flags/ss.svg | 8 + src/dota_notes/ui/images/flags/st.svg | 16 + src/dota_notes/ui/images/flags/sv.svg | 594 +++ src/dota_notes/ui/images/flags/sx.svg | 56 + src/dota_notes/ui/images/flags/sy.svg | 6 + src/dota_notes/ui/images/flags/sz.svg | 34 + src/dota_notes/ui/images/flags/ta.svg | 76 + src/dota_notes/ui/images/flags/tc.svg | 50 + src/dota_notes/ui/images/flags/td.svg | 7 + src/dota_notes/ui/images/flags/tf.svg | 15 + src/dota_notes/ui/images/flags/tg.svg | 14 + src/dota_notes/ui/images/flags/th.svg | 7 + src/dota_notes/ui/images/flags/tj.svg | 22 + src/dota_notes/ui/images/flags/tk.svg | 5 + src/dota_notes/ui/images/flags/tl.svg | 13 + src/dota_notes/ui/images/flags/tm.svg | 205 ++ src/dota_notes/ui/images/flags/tn.svg | 4 + src/dota_notes/ui/images/flags/to.svg | 10 + src/dota_notes/ui/images/flags/tr.svg | 8 + src/dota_notes/ui/images/flags/tt.svg | 5 + src/dota_notes/ui/images/flags/tv.svg | 9 + src/dota_notes/ui/images/flags/tw.svg | 34 + src/dota_notes/ui/images/flags/tz.svg | 13 + src/dota_notes/ui/images/flags/ua.svg | 6 + src/dota_notes/ui/images/flags/ug.svg | 30 + src/dota_notes/ui/images/flags/um.svg | 9 + src/dota_notes/ui/images/flags/un.svg | 16 + src/dota_notes/ui/images/flags/us.svg | 9 + src/dota_notes/ui/images/flags/uy.svg | 28 + src/dota_notes/ui/images/flags/uz.svg | 30 + src/dota_notes/ui/images/flags/va.svg | 190 + src/dota_notes/ui/images/flags/vc.svg | 8 + src/dota_notes/ui/images/flags/ve.svg | 26 + src/dota_notes/ui/images/flags/vg.svg | 59 + src/dota_notes/ui/images/flags/vi.svg | 28 + src/dota_notes/ui/images/flags/vn.svg | 11 + src/dota_notes/ui/images/flags/vu.svg | 21 + src/dota_notes/ui/images/flags/wf.svg | 5 + src/dota_notes/ui/images/flags/ws.svg | 7 + src/dota_notes/ui/images/flags/xk.svg | 5 + src/dota_notes/ui/images/flags/xx.svg | 4 + src/dota_notes/ui/images/flags/ye.svg | 7 + src/dota_notes/ui/images/flags/yt.svg | 5 + src/dota_notes/ui/images/flags/za.svg | 17 + src/dota_notes/ui/images/flags/zm.svg | 27 + src/dota_notes/ui/images/flags/zw.svg | 21 + src/dota_notes/ui/images/history.svg | 1 + src/dota_notes/ui/images/note.svg | 1 + src/dota_notes/ui/images/person_search.svg | 1 + src/dota_notes/ui/images/public.svg | 1 + src/dota_notes/ui/images/smurf.png | Bin 0 -> 2951 bytes src/dota_notes/ui/images/videogame_asset.svg | 1 + src/dota_notes/ui/main_window.py | 88 +- src/dota_notes/ui/resources.qrc | 276 ++ src/dota_notes/ui/ui_main_window.ui | 3224 ++++++++++------- 298 files changed, 12983 insertions(+), 1844 deletions(-) delete mode 100644 src/dota_notes/app_dota.py create mode 100644 src/dota_notes/data/models/__init__.py create mode 100644 src/dota_notes/data/models/base_entity.py create mode 100644 src/dota_notes/data/models/database.py rename src/dota_notes/data/{models.py => models/player_entity.py} (59%) create mode 100644 src/dota_notes/data/models/settings_entity.py delete mode 100644 src/dota_notes/data/states.py create mode 100644 src/dota_notes/data/states/__init__.py create mode 100644 src/dota_notes/data/states/game_state.py create mode 100644 src/dota_notes/data/states/player_state.py create mode 100644 src/dota_notes/ui/fonts/Roboto-Medium.ttf create mode 100644 src/dota_notes/ui/images/description.svg create mode 100644 src/dota_notes/ui/images/download.svg create mode 100644 src/dota_notes/ui/images/flags/ac.svg create mode 100644 src/dota_notes/ui/images/flags/ad.svg create mode 100644 src/dota_notes/ui/images/flags/ae.svg create mode 100644 src/dota_notes/ui/images/flags/af.svg create mode 100644 src/dota_notes/ui/images/flags/ag.svg create mode 100644 src/dota_notes/ui/images/flags/ai.svg create mode 100644 src/dota_notes/ui/images/flags/al.svg create mode 100644 src/dota_notes/ui/images/flags/am.svg create mode 100644 src/dota_notes/ui/images/flags/ao.svg create mode 100644 src/dota_notes/ui/images/flags/aq.svg create mode 100644 src/dota_notes/ui/images/flags/ar.svg create mode 100644 src/dota_notes/ui/images/flags/arab.svg create mode 100644 src/dota_notes/ui/images/flags/as.svg create mode 100644 src/dota_notes/ui/images/flags/at.svg create mode 100644 src/dota_notes/ui/images/flags/au.svg create mode 100644 src/dota_notes/ui/images/flags/aw.svg create mode 100644 src/dota_notes/ui/images/flags/ax.svg create mode 100644 src/dota_notes/ui/images/flags/az.svg create mode 100644 src/dota_notes/ui/images/flags/ba.svg create mode 100644 src/dota_notes/ui/images/flags/bb.svg create mode 100644 src/dota_notes/ui/images/flags/bd.svg create mode 100644 src/dota_notes/ui/images/flags/be.svg create mode 100644 src/dota_notes/ui/images/flags/bf.svg create mode 100644 src/dota_notes/ui/images/flags/bg.svg create mode 100644 src/dota_notes/ui/images/flags/bh.svg create mode 100644 src/dota_notes/ui/images/flags/bi.svg create mode 100644 src/dota_notes/ui/images/flags/bj.svg create mode 100644 src/dota_notes/ui/images/flags/bl.svg create mode 100644 src/dota_notes/ui/images/flags/bm.svg create mode 100644 src/dota_notes/ui/images/flags/bn.svg create mode 100644 src/dota_notes/ui/images/flags/bo.svg create mode 100644 src/dota_notes/ui/images/flags/bq.svg create mode 100644 src/dota_notes/ui/images/flags/br.svg create mode 100644 src/dota_notes/ui/images/flags/bs.svg create mode 100644 src/dota_notes/ui/images/flags/bt.svg create mode 100644 src/dota_notes/ui/images/flags/bv.svg create mode 100644 src/dota_notes/ui/images/flags/bw.svg create mode 100644 src/dota_notes/ui/images/flags/by.svg create mode 100644 src/dota_notes/ui/images/flags/bz.svg create mode 100644 src/dota_notes/ui/images/flags/ca.svg create mode 100644 src/dota_notes/ui/images/flags/cc.svg create mode 100644 src/dota_notes/ui/images/flags/cd.svg create mode 100644 src/dota_notes/ui/images/flags/cefta.svg create mode 100644 src/dota_notes/ui/images/flags/cf.svg create mode 100644 src/dota_notes/ui/images/flags/cg.svg create mode 100644 src/dota_notes/ui/images/flags/ch.svg create mode 100644 src/dota_notes/ui/images/flags/ci.svg create mode 100644 src/dota_notes/ui/images/flags/ck.svg create mode 100644 src/dota_notes/ui/images/flags/cl.svg create mode 100644 src/dota_notes/ui/images/flags/cm.svg create mode 100644 src/dota_notes/ui/images/flags/cn.svg create mode 100644 src/dota_notes/ui/images/flags/co.svg create mode 100644 src/dota_notes/ui/images/flags/cp.svg create mode 100644 src/dota_notes/ui/images/flags/cr.svg create mode 100644 src/dota_notes/ui/images/flags/cu.svg create mode 100644 src/dota_notes/ui/images/flags/cv.svg create mode 100644 src/dota_notes/ui/images/flags/cw.svg create mode 100644 src/dota_notes/ui/images/flags/cx.svg create mode 100644 src/dota_notes/ui/images/flags/cy.svg create mode 100644 src/dota_notes/ui/images/flags/cz.svg create mode 100644 src/dota_notes/ui/images/flags/de.svg create mode 100644 src/dota_notes/ui/images/flags/dg.svg create mode 100644 src/dota_notes/ui/images/flags/dj.svg create mode 100644 src/dota_notes/ui/images/flags/dk.svg create mode 100644 src/dota_notes/ui/images/flags/dm.svg create mode 100644 src/dota_notes/ui/images/flags/do.svg create mode 100644 src/dota_notes/ui/images/flags/dz.svg create mode 100644 src/dota_notes/ui/images/flags/eac.svg create mode 100644 src/dota_notes/ui/images/flags/ec.svg create mode 100644 src/dota_notes/ui/images/flags/ee.svg create mode 100644 src/dota_notes/ui/images/flags/eg.svg create mode 100644 src/dota_notes/ui/images/flags/eh.svg create mode 100644 src/dota_notes/ui/images/flags/er.svg create mode 100644 src/dota_notes/ui/images/flags/es-ct.svg create mode 100644 src/dota_notes/ui/images/flags/es-ga.svg create mode 100644 src/dota_notes/ui/images/flags/es-pv.svg create mode 100644 src/dota_notes/ui/images/flags/es.svg create mode 100644 src/dota_notes/ui/images/flags/et.svg create mode 100644 src/dota_notes/ui/images/flags/eu.svg create mode 100644 src/dota_notes/ui/images/flags/fi.svg create mode 100644 src/dota_notes/ui/images/flags/fj.svg create mode 100644 src/dota_notes/ui/images/flags/fk.svg create mode 100644 src/dota_notes/ui/images/flags/fm.svg create mode 100644 src/dota_notes/ui/images/flags/fo.svg create mode 100644 src/dota_notes/ui/images/flags/fr.svg create mode 100644 src/dota_notes/ui/images/flags/ga.svg create mode 100644 src/dota_notes/ui/images/flags/gb-eng.svg create mode 100644 src/dota_notes/ui/images/flags/gb-nir.svg create mode 100644 src/dota_notes/ui/images/flags/gb-sct.svg create mode 100644 src/dota_notes/ui/images/flags/gb-wls.svg create mode 100644 src/dota_notes/ui/images/flags/gb.svg create mode 100644 src/dota_notes/ui/images/flags/gd.svg create mode 100644 src/dota_notes/ui/images/flags/ge.svg create mode 100644 src/dota_notes/ui/images/flags/gf.svg create mode 100644 src/dota_notes/ui/images/flags/gg.svg create mode 100644 src/dota_notes/ui/images/flags/gh.svg create mode 100644 src/dota_notes/ui/images/flags/gi.svg create mode 100644 src/dota_notes/ui/images/flags/gl.svg create mode 100644 src/dota_notes/ui/images/flags/gm.svg create mode 100644 src/dota_notes/ui/images/flags/gn.svg create mode 100644 src/dota_notes/ui/images/flags/gp.svg create mode 100644 src/dota_notes/ui/images/flags/gq.svg create mode 100644 src/dota_notes/ui/images/flags/gr.svg create mode 100644 src/dota_notes/ui/images/flags/gs.svg create mode 100644 src/dota_notes/ui/images/flags/gt.svg create mode 100644 src/dota_notes/ui/images/flags/gu.svg create mode 100644 src/dota_notes/ui/images/flags/gw.svg create mode 100644 src/dota_notes/ui/images/flags/gy.svg create mode 100644 src/dota_notes/ui/images/flags/hk.svg create mode 100644 src/dota_notes/ui/images/flags/hm.svg create mode 100644 src/dota_notes/ui/images/flags/hn.svg create mode 100644 src/dota_notes/ui/images/flags/hr.svg create mode 100644 src/dota_notes/ui/images/flags/ht.svg create mode 100644 src/dota_notes/ui/images/flags/hu.svg create mode 100644 src/dota_notes/ui/images/flags/ic.svg create mode 100644 src/dota_notes/ui/images/flags/id.svg create mode 100644 src/dota_notes/ui/images/flags/ie.svg create mode 100644 src/dota_notes/ui/images/flags/il.svg create mode 100644 src/dota_notes/ui/images/flags/im.svg create mode 100644 src/dota_notes/ui/images/flags/in.svg create mode 100644 src/dota_notes/ui/images/flags/io.svg create mode 100644 src/dota_notes/ui/images/flags/iq.svg create mode 100644 src/dota_notes/ui/images/flags/ir.svg create mode 100644 src/dota_notes/ui/images/flags/is.svg create mode 100644 src/dota_notes/ui/images/flags/it.svg create mode 100644 src/dota_notes/ui/images/flags/je.svg create mode 100644 src/dota_notes/ui/images/flags/jm.svg create mode 100644 src/dota_notes/ui/images/flags/jo.svg create mode 100644 src/dota_notes/ui/images/flags/jp.svg create mode 100644 src/dota_notes/ui/images/flags/ke.svg create mode 100644 src/dota_notes/ui/images/flags/kg.svg create mode 100644 src/dota_notes/ui/images/flags/kh.svg create mode 100644 src/dota_notes/ui/images/flags/ki.svg create mode 100644 src/dota_notes/ui/images/flags/km.svg create mode 100644 src/dota_notes/ui/images/flags/kn.svg create mode 100644 src/dota_notes/ui/images/flags/kp.svg create mode 100644 src/dota_notes/ui/images/flags/kr.svg create mode 100644 src/dota_notes/ui/images/flags/kw.svg create mode 100644 src/dota_notes/ui/images/flags/ky.svg create mode 100644 src/dota_notes/ui/images/flags/kz.svg create mode 100644 src/dota_notes/ui/images/flags/la.svg create mode 100644 src/dota_notes/ui/images/flags/lb.svg create mode 100644 src/dota_notes/ui/images/flags/lc.svg create mode 100644 src/dota_notes/ui/images/flags/li.svg create mode 100644 src/dota_notes/ui/images/flags/lk.svg create mode 100644 src/dota_notes/ui/images/flags/lr.svg create mode 100644 src/dota_notes/ui/images/flags/ls.svg create mode 100644 src/dota_notes/ui/images/flags/lt.svg create mode 100644 src/dota_notes/ui/images/flags/lu.svg create mode 100644 src/dota_notes/ui/images/flags/lv.svg create mode 100644 src/dota_notes/ui/images/flags/ly.svg create mode 100644 src/dota_notes/ui/images/flags/ma.svg create mode 100644 src/dota_notes/ui/images/flags/mc.svg create mode 100644 src/dota_notes/ui/images/flags/md.svg create mode 100644 src/dota_notes/ui/images/flags/me.svg create mode 100644 src/dota_notes/ui/images/flags/mf.svg create mode 100644 src/dota_notes/ui/images/flags/mg.svg create mode 100644 src/dota_notes/ui/images/flags/mh.svg create mode 100644 src/dota_notes/ui/images/flags/mk.svg create mode 100644 src/dota_notes/ui/images/flags/ml.svg create mode 100644 src/dota_notes/ui/images/flags/mm.svg create mode 100644 src/dota_notes/ui/images/flags/mn.svg create mode 100644 src/dota_notes/ui/images/flags/mo.svg create mode 100644 src/dota_notes/ui/images/flags/mp.svg create mode 100644 src/dota_notes/ui/images/flags/mq.svg create mode 100644 src/dota_notes/ui/images/flags/mr.svg create mode 100644 src/dota_notes/ui/images/flags/ms.svg create mode 100644 src/dota_notes/ui/images/flags/mt.svg create mode 100644 src/dota_notes/ui/images/flags/mu.svg create mode 100644 src/dota_notes/ui/images/flags/mv.svg create mode 100644 src/dota_notes/ui/images/flags/mw.svg create mode 100644 src/dota_notes/ui/images/flags/mx.svg create mode 100644 src/dota_notes/ui/images/flags/my.svg create mode 100644 src/dota_notes/ui/images/flags/mz.svg create mode 100644 src/dota_notes/ui/images/flags/na.svg create mode 100644 src/dota_notes/ui/images/flags/nc.svg create mode 100644 src/dota_notes/ui/images/flags/ne.svg create mode 100644 src/dota_notes/ui/images/flags/nf.svg create mode 100644 src/dota_notes/ui/images/flags/ng.svg create mode 100644 src/dota_notes/ui/images/flags/ni.svg create mode 100644 src/dota_notes/ui/images/flags/nl.svg create mode 100644 src/dota_notes/ui/images/flags/no.svg create mode 100644 src/dota_notes/ui/images/flags/np.svg create mode 100644 src/dota_notes/ui/images/flags/nr.svg create mode 100644 src/dota_notes/ui/images/flags/nu.svg create mode 100644 src/dota_notes/ui/images/flags/nz.svg create mode 100644 src/dota_notes/ui/images/flags/om.svg create mode 100644 src/dota_notes/ui/images/flags/pa.svg create mode 100644 src/dota_notes/ui/images/flags/pe.svg create mode 100644 src/dota_notes/ui/images/flags/pf.svg create mode 100644 src/dota_notes/ui/images/flags/pg.svg create mode 100644 src/dota_notes/ui/images/flags/ph.svg create mode 100644 src/dota_notes/ui/images/flags/pk.svg create mode 100644 src/dota_notes/ui/images/flags/pl.svg create mode 100644 src/dota_notes/ui/images/flags/pm.svg create mode 100644 src/dota_notes/ui/images/flags/pn.svg create mode 100644 src/dota_notes/ui/images/flags/pr.svg create mode 100644 src/dota_notes/ui/images/flags/ps.svg create mode 100644 src/dota_notes/ui/images/flags/pt.svg create mode 100644 src/dota_notes/ui/images/flags/pw.svg create mode 100644 src/dota_notes/ui/images/flags/py.svg create mode 100644 src/dota_notes/ui/images/flags/qa.svg create mode 100644 src/dota_notes/ui/images/flags/re.svg create mode 100644 src/dota_notes/ui/images/flags/ro.svg create mode 100644 src/dota_notes/ui/images/flags/rs.svg create mode 100644 src/dota_notes/ui/images/flags/ru.svg create mode 100644 src/dota_notes/ui/images/flags/rw.svg create mode 100644 src/dota_notes/ui/images/flags/sa.svg create mode 100644 src/dota_notes/ui/images/flags/sb.svg create mode 100644 src/dota_notes/ui/images/flags/sc.svg create mode 100644 src/dota_notes/ui/images/flags/sd.svg create mode 100644 src/dota_notes/ui/images/flags/se.svg create mode 100644 src/dota_notes/ui/images/flags/sg.svg create mode 100644 src/dota_notes/ui/images/flags/sh.svg create mode 100644 src/dota_notes/ui/images/flags/si.svg create mode 100644 src/dota_notes/ui/images/flags/sj.svg create mode 100644 src/dota_notes/ui/images/flags/sk.svg create mode 100644 src/dota_notes/ui/images/flags/sl.svg create mode 100644 src/dota_notes/ui/images/flags/sm.svg create mode 100644 src/dota_notes/ui/images/flags/sn.svg create mode 100644 src/dota_notes/ui/images/flags/so.svg create mode 100644 src/dota_notes/ui/images/flags/sr.svg create mode 100644 src/dota_notes/ui/images/flags/ss.svg create mode 100644 src/dota_notes/ui/images/flags/st.svg create mode 100644 src/dota_notes/ui/images/flags/sv.svg create mode 100644 src/dota_notes/ui/images/flags/sx.svg create mode 100644 src/dota_notes/ui/images/flags/sy.svg create mode 100644 src/dota_notes/ui/images/flags/sz.svg create mode 100644 src/dota_notes/ui/images/flags/ta.svg create mode 100644 src/dota_notes/ui/images/flags/tc.svg create mode 100644 src/dota_notes/ui/images/flags/td.svg create mode 100644 src/dota_notes/ui/images/flags/tf.svg create mode 100644 src/dota_notes/ui/images/flags/tg.svg create mode 100644 src/dota_notes/ui/images/flags/th.svg create mode 100644 src/dota_notes/ui/images/flags/tj.svg create mode 100644 src/dota_notes/ui/images/flags/tk.svg create mode 100644 src/dota_notes/ui/images/flags/tl.svg create mode 100644 src/dota_notes/ui/images/flags/tm.svg create mode 100644 src/dota_notes/ui/images/flags/tn.svg create mode 100644 src/dota_notes/ui/images/flags/to.svg create mode 100644 src/dota_notes/ui/images/flags/tr.svg create mode 100644 src/dota_notes/ui/images/flags/tt.svg create mode 100644 src/dota_notes/ui/images/flags/tv.svg create mode 100644 src/dota_notes/ui/images/flags/tw.svg create mode 100644 src/dota_notes/ui/images/flags/tz.svg create mode 100644 src/dota_notes/ui/images/flags/ua.svg create mode 100644 src/dota_notes/ui/images/flags/ug.svg create mode 100644 src/dota_notes/ui/images/flags/um.svg create mode 100644 src/dota_notes/ui/images/flags/un.svg create mode 100644 src/dota_notes/ui/images/flags/us.svg create mode 100644 src/dota_notes/ui/images/flags/uy.svg create mode 100644 src/dota_notes/ui/images/flags/uz.svg create mode 100644 src/dota_notes/ui/images/flags/va.svg create mode 100644 src/dota_notes/ui/images/flags/vc.svg create mode 100644 src/dota_notes/ui/images/flags/ve.svg create mode 100644 src/dota_notes/ui/images/flags/vg.svg create mode 100644 src/dota_notes/ui/images/flags/vi.svg create mode 100644 src/dota_notes/ui/images/flags/vn.svg create mode 100644 src/dota_notes/ui/images/flags/vu.svg create mode 100644 src/dota_notes/ui/images/flags/wf.svg create mode 100644 src/dota_notes/ui/images/flags/ws.svg create mode 100644 src/dota_notes/ui/images/flags/xk.svg create mode 100644 src/dota_notes/ui/images/flags/xx.svg create mode 100644 src/dota_notes/ui/images/flags/ye.svg create mode 100644 src/dota_notes/ui/images/flags/yt.svg create mode 100644 src/dota_notes/ui/images/flags/za.svg create mode 100644 src/dota_notes/ui/images/flags/zm.svg create mode 100644 src/dota_notes/ui/images/flags/zw.svg create mode 100644 src/dota_notes/ui/images/history.svg create mode 100644 src/dota_notes/ui/images/note.svg create mode 100644 src/dota_notes/ui/images/person_search.svg create mode 100644 src/dota_notes/ui/images/public.svg create mode 100644 src/dota_notes/ui/images/smurf.png create mode 100644 src/dota_notes/ui/images/videogame_asset.svg 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 0000000000000000000000000000000000000000..ac0f908b9c9c73da558b45d65cc5c6094874d3e8 GIT binary patch literal 168644 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 X76wnEi(n^v8!x?bp_;lO!DIggn3ZN8 literal 0 HcmV?d00001 diff --git a/src/dota_notes/ui/images/description.svg b/src/dota_notes/ui/images/description.svg new file mode 100644 index 0000000..8f9446a --- /dev/null +++ b/src/dota_notes/ui/images/description.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/dota_notes/ui/images/download.svg b/src/dota_notes/ui/images/download.svg new file mode 100644 index 0000000..c4ec1c3 --- /dev/null +++ b/src/dota_notes/ui/images/download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/dota_notes/ui/images/flags/ac.svg b/src/dota_notes/ui/images/flags/ac.svg new file mode 100644 index 0000000..1a6d508 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ac.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ad.svg b/src/dota_notes/ui/images/flags/ad.svg new file mode 100644 index 0000000..3793d99 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ad.svg @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ae.svg b/src/dota_notes/ui/images/flags/ae.svg new file mode 100644 index 0000000..b7acdbd --- /dev/null +++ b/src/dota_notes/ui/images/flags/ae.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/af.svg b/src/dota_notes/ui/images/flags/af.svg new file mode 100644 index 0000000..417dd04 --- /dev/null +++ b/src/dota_notes/ui/images/flags/af.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ag.svg b/src/dota_notes/ui/images/flags/ag.svg new file mode 100644 index 0000000..250b501 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ag.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ai.svg b/src/dota_notes/ui/images/flags/ai.svg new file mode 100644 index 0000000..502fcb6 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ai.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/al.svg b/src/dota_notes/ui/images/flags/al.svg new file mode 100644 index 0000000..b69ae19 --- /dev/null +++ b/src/dota_notes/ui/images/flags/al.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/am.svg b/src/dota_notes/ui/images/flags/am.svg new file mode 100644 index 0000000..99fa4dc --- /dev/null +++ b/src/dota_notes/ui/images/flags/am.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/ao.svg b/src/dota_notes/ui/images/flags/ao.svg new file mode 100644 index 0000000..4dc39f6 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ao.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/aq.svg b/src/dota_notes/ui/images/flags/aq.svg new file mode 100644 index 0000000..53840cc --- /dev/null +++ b/src/dota_notes/ui/images/flags/aq.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/ar.svg b/src/dota_notes/ui/images/flags/ar.svg new file mode 100644 index 0000000..364fca8 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ar.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/arab.svg b/src/dota_notes/ui/images/flags/arab.svg new file mode 100644 index 0000000..c45e3d2 --- /dev/null +++ b/src/dota_notes/ui/images/flags/arab.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/as.svg b/src/dota_notes/ui/images/flags/as.svg new file mode 100644 index 0000000..b974013 --- /dev/null +++ b/src/dota_notes/ui/images/flags/as.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/at.svg b/src/dota_notes/ui/images/flags/at.svg new file mode 100644 index 0000000..c282508 --- /dev/null +++ b/src/dota_notes/ui/images/flags/at.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/au.svg b/src/dota_notes/ui/images/flags/au.svg new file mode 100644 index 0000000..407fef4 --- /dev/null +++ b/src/dota_notes/ui/images/flags/au.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/aw.svg b/src/dota_notes/ui/images/flags/aw.svg new file mode 100644 index 0000000..32cabd5 --- /dev/null +++ b/src/dota_notes/ui/images/flags/aw.svg @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ax.svg b/src/dota_notes/ui/images/flags/ax.svg new file mode 100644 index 0000000..0584d71 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ax.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/az.svg b/src/dota_notes/ui/images/flags/az.svg new file mode 100644 index 0000000..8e56ef5 --- /dev/null +++ b/src/dota_notes/ui/images/flags/az.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ba.svg b/src/dota_notes/ui/images/flags/ba.svg new file mode 100644 index 0000000..fcd1891 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ba.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bb.svg b/src/dota_notes/ui/images/flags/bb.svg new file mode 100644 index 0000000..263bdec --- /dev/null +++ b/src/dota_notes/ui/images/flags/bb.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/bd.svg b/src/dota_notes/ui/images/flags/bd.svg new file mode 100644 index 0000000..16b794d --- /dev/null +++ b/src/dota_notes/ui/images/flags/bd.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/dota_notes/ui/images/flags/be.svg b/src/dota_notes/ui/images/flags/be.svg new file mode 100644 index 0000000..327f28f --- /dev/null +++ b/src/dota_notes/ui/images/flags/be.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bf.svg b/src/dota_notes/ui/images/flags/bf.svg new file mode 100644 index 0000000..4713822 --- /dev/null +++ b/src/dota_notes/ui/images/flags/bf.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bg.svg b/src/dota_notes/ui/images/flags/bg.svg new file mode 100644 index 0000000..b100dd0 --- /dev/null +++ b/src/dota_notes/ui/images/flags/bg.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bh.svg b/src/dota_notes/ui/images/flags/bh.svg new file mode 100644 index 0000000..7a2ea54 --- /dev/null +++ b/src/dota_notes/ui/images/flags/bh.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/dota_notes/ui/images/flags/bi.svg b/src/dota_notes/ui/images/flags/bi.svg new file mode 100644 index 0000000..1050838 --- /dev/null +++ b/src/dota_notes/ui/images/flags/bi.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bj.svg b/src/dota_notes/ui/images/flags/bj.svg new file mode 100644 index 0000000..0846724 --- /dev/null +++ b/src/dota_notes/ui/images/flags/bj.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bl.svg b/src/dota_notes/ui/images/flags/bl.svg new file mode 100644 index 0000000..819afc1 --- /dev/null +++ b/src/dota_notes/ui/images/flags/bl.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/bm.svg b/src/dota_notes/ui/images/flags/bm.svg new file mode 100644 index 0000000..a4dbc72 --- /dev/null +++ b/src/dota_notes/ui/images/flags/bm.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bn.svg b/src/dota_notes/ui/images/flags/bn.svg new file mode 100644 index 0000000..f906abf --- /dev/null +++ b/src/dota_notes/ui/images/flags/bn.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bo.svg b/src/dota_notes/ui/images/flags/bo.svg new file mode 100644 index 0000000..17a0a0c --- /dev/null +++ b/src/dota_notes/ui/images/flags/bo.svg @@ -0,0 +1,676 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bq.svg b/src/dota_notes/ui/images/flags/bq.svg new file mode 100644 index 0000000..0e6bc76 --- /dev/null +++ b/src/dota_notes/ui/images/flags/bq.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/br.svg b/src/dota_notes/ui/images/flags/br.svg new file mode 100644 index 0000000..354a701 --- /dev/null +++ b/src/dota_notes/ui/images/flags/br.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bs.svg b/src/dota_notes/ui/images/flags/bs.svg new file mode 100644 index 0000000..513be43 --- /dev/null +++ b/src/dota_notes/ui/images/flags/bs.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bt.svg b/src/dota_notes/ui/images/flags/bt.svg new file mode 100644 index 0000000..cea6006 --- /dev/null +++ b/src/dota_notes/ui/images/flags/bt.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bv.svg b/src/dota_notes/ui/images/flags/bv.svg new file mode 100644 index 0000000..40e16d9 --- /dev/null +++ b/src/dota_notes/ui/images/flags/bv.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bw.svg b/src/dota_notes/ui/images/flags/bw.svg new file mode 100644 index 0000000..a1c8db0 --- /dev/null +++ b/src/dota_notes/ui/images/flags/bw.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/by.svg b/src/dota_notes/ui/images/flags/by.svg new file mode 100644 index 0000000..8d25ee3 --- /dev/null +++ b/src/dota_notes/ui/images/flags/by.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/bz.svg b/src/dota_notes/ui/images/flags/bz.svg new file mode 100644 index 0000000..08d3579 --- /dev/null +++ b/src/dota_notes/ui/images/flags/bz.svg @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ca.svg b/src/dota_notes/ui/images/flags/ca.svg new file mode 100644 index 0000000..f1b2c96 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ca.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/dota_notes/ui/images/flags/cc.svg b/src/dota_notes/ui/images/flags/cc.svg new file mode 100644 index 0000000..93025bd --- /dev/null +++ b/src/dota_notes/ui/images/flags/cc.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/cd.svg b/src/dota_notes/ui/images/flags/cd.svg new file mode 100644 index 0000000..e106ddd --- /dev/null +++ b/src/dota_notes/ui/images/flags/cd.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/cefta.svg b/src/dota_notes/ui/images/flags/cefta.svg new file mode 100644 index 0000000..f748d08 --- /dev/null +++ b/src/dota_notes/ui/images/flags/cefta.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/cf.svg b/src/dota_notes/ui/images/flags/cf.svg new file mode 100644 index 0000000..a6cd367 --- /dev/null +++ b/src/dota_notes/ui/images/flags/cf.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/cg.svg b/src/dota_notes/ui/images/flags/cg.svg new file mode 100644 index 0000000..9128715 --- /dev/null +++ b/src/dota_notes/ui/images/flags/cg.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ch.svg b/src/dota_notes/ui/images/flags/ch.svg new file mode 100644 index 0000000..b42d670 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ch.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ci.svg b/src/dota_notes/ui/images/flags/ci.svg new file mode 100644 index 0000000..e400f0c --- /dev/null +++ b/src/dota_notes/ui/images/flags/ci.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ck.svg b/src/dota_notes/ui/images/flags/ck.svg new file mode 100644 index 0000000..18e547b --- /dev/null +++ b/src/dota_notes/ui/images/flags/ck.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/cl.svg b/src/dota_notes/ui/images/flags/cl.svg new file mode 100644 index 0000000..01766fe --- /dev/null +++ b/src/dota_notes/ui/images/flags/cl.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/cm.svg b/src/dota_notes/ui/images/flags/cm.svg new file mode 100644 index 0000000..389b662 --- /dev/null +++ b/src/dota_notes/ui/images/flags/cm.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/cn.svg b/src/dota_notes/ui/images/flags/cn.svg new file mode 100644 index 0000000..10d3489 --- /dev/null +++ b/src/dota_notes/ui/images/flags/cn.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/co.svg b/src/dota_notes/ui/images/flags/co.svg new file mode 100644 index 0000000..ebd0a0f --- /dev/null +++ b/src/dota_notes/ui/images/flags/co.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/cp.svg b/src/dota_notes/ui/images/flags/cp.svg new file mode 100644 index 0000000..b3efb07 --- /dev/null +++ b/src/dota_notes/ui/images/flags/cp.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/cr.svg b/src/dota_notes/ui/images/flags/cr.svg new file mode 100644 index 0000000..5a409ee --- /dev/null +++ b/src/dota_notes/ui/images/flags/cr.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/cu.svg b/src/dota_notes/ui/images/flags/cu.svg new file mode 100644 index 0000000..6464f8e --- /dev/null +++ b/src/dota_notes/ui/images/flags/cu.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/cv.svg b/src/dota_notes/ui/images/flags/cv.svg new file mode 100644 index 0000000..5c251da --- /dev/null +++ b/src/dota_notes/ui/images/flags/cv.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/cw.svg b/src/dota_notes/ui/images/flags/cw.svg new file mode 100644 index 0000000..bb0ece2 --- /dev/null +++ b/src/dota_notes/ui/images/flags/cw.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/cx.svg b/src/dota_notes/ui/images/flags/cx.svg new file mode 100644 index 0000000..6803b3b --- /dev/null +++ b/src/dota_notes/ui/images/flags/cx.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/cy.svg b/src/dota_notes/ui/images/flags/cy.svg new file mode 100644 index 0000000..2f69bf7 --- /dev/null +++ b/src/dota_notes/ui/images/flags/cy.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/cz.svg b/src/dota_notes/ui/images/flags/cz.svg new file mode 100644 index 0000000..7913de3 --- /dev/null +++ b/src/dota_notes/ui/images/flags/cz.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/de.svg b/src/dota_notes/ui/images/flags/de.svg new file mode 100644 index 0000000..b08334b --- /dev/null +++ b/src/dota_notes/ui/images/flags/de.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/dg.svg b/src/dota_notes/ui/images/flags/dg.svg new file mode 100644 index 0000000..b9f99a9 --- /dev/null +++ b/src/dota_notes/ui/images/flags/dg.svg @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/dj.svg b/src/dota_notes/ui/images/flags/dj.svg new file mode 100644 index 0000000..ebf2fc6 --- /dev/null +++ b/src/dota_notes/ui/images/flags/dj.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/dk.svg b/src/dota_notes/ui/images/flags/dk.svg new file mode 100644 index 0000000..563277f --- /dev/null +++ b/src/dota_notes/ui/images/flags/dk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/dm.svg b/src/dota_notes/ui/images/flags/dm.svg new file mode 100644 index 0000000..60457b7 --- /dev/null +++ b/src/dota_notes/ui/images/flags/dm.svg @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/do.svg b/src/dota_notes/ui/images/flags/do.svg new file mode 100644 index 0000000..9c1becc --- /dev/null +++ b/src/dota_notes/ui/images/flags/do.svg @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/dz.svg b/src/dota_notes/ui/images/flags/dz.svg new file mode 100644 index 0000000..5ff29a7 --- /dev/null +++ b/src/dota_notes/ui/images/flags/dz.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/eac.svg b/src/dota_notes/ui/images/flags/eac.svg new file mode 100644 index 0000000..613099c --- /dev/null +++ b/src/dota_notes/ui/images/flags/eac.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ec.svg b/src/dota_notes/ui/images/flags/ec.svg new file mode 100644 index 0000000..65b7885 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ec.svg @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ee.svg b/src/dota_notes/ui/images/flags/ee.svg new file mode 100644 index 0000000..36ea288 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ee.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/eg.svg b/src/dota_notes/ui/images/flags/eg.svg new file mode 100644 index 0000000..58c943c --- /dev/null +++ b/src/dota_notes/ui/images/flags/eg.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/eh.svg b/src/dota_notes/ui/images/flags/eh.svg new file mode 100644 index 0000000..2c9525b --- /dev/null +++ b/src/dota_notes/ui/images/flags/eh.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/er.svg b/src/dota_notes/ui/images/flags/er.svg new file mode 100644 index 0000000..2705295 --- /dev/null +++ b/src/dota_notes/ui/images/flags/er.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/es-ct.svg b/src/dota_notes/ui/images/flags/es-ct.svg new file mode 100644 index 0000000..4d85911 --- /dev/null +++ b/src/dota_notes/ui/images/flags/es-ct.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/dota_notes/ui/images/flags/es-ga.svg b/src/dota_notes/ui/images/flags/es-ga.svg new file mode 100644 index 0000000..a91ffed --- /dev/null +++ b/src/dota_notes/ui/images/flags/es-ga.svg @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/es-pv.svg b/src/dota_notes/ui/images/flags/es-pv.svg new file mode 100644 index 0000000..21c8759 --- /dev/null +++ b/src/dota_notes/ui/images/flags/es-pv.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/es.svg b/src/dota_notes/ui/images/flags/es.svg new file mode 100644 index 0000000..815e0f8 --- /dev/null +++ b/src/dota_notes/ui/images/flags/es.svg @@ -0,0 +1,544 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/et.svg b/src/dota_notes/ui/images/flags/et.svg new file mode 100644 index 0000000..a3378fd --- /dev/null +++ b/src/dota_notes/ui/images/flags/et.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/eu.svg b/src/dota_notes/ui/images/flags/eu.svg new file mode 100644 index 0000000..bbfefd6 --- /dev/null +++ b/src/dota_notes/ui/images/flags/eu.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/fi.svg b/src/dota_notes/ui/images/flags/fi.svg new file mode 100644 index 0000000..470be2d --- /dev/null +++ b/src/dota_notes/ui/images/flags/fi.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/fj.svg b/src/dota_notes/ui/images/flags/fj.svg new file mode 100644 index 0000000..2d7cd98 --- /dev/null +++ b/src/dota_notes/ui/images/flags/fj.svg @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/fk.svg b/src/dota_notes/ui/images/flags/fk.svg new file mode 100644 index 0000000..b4935a5 --- /dev/null +++ b/src/dota_notes/ui/images/flags/fk.svg @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/fm.svg b/src/dota_notes/ui/images/flags/fm.svg new file mode 100644 index 0000000..85f4f47 --- /dev/null +++ b/src/dota_notes/ui/images/flags/fm.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/fo.svg b/src/dota_notes/ui/images/flags/fo.svg new file mode 100644 index 0000000..717ee20 --- /dev/null +++ b/src/dota_notes/ui/images/flags/fo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/fr.svg b/src/dota_notes/ui/images/flags/fr.svg new file mode 100644 index 0000000..79689fe --- /dev/null +++ b/src/dota_notes/ui/images/flags/fr.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/ga.svg b/src/dota_notes/ui/images/flags/ga.svg new file mode 100644 index 0000000..76edab4 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ga.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gb-eng.svg b/src/dota_notes/ui/images/flags/gb-eng.svg new file mode 100644 index 0000000..12e3b67 --- /dev/null +++ b/src/dota_notes/ui/images/flags/gb-eng.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/gb-nir.svg b/src/dota_notes/ui/images/flags/gb-nir.svg new file mode 100644 index 0000000..c9510f3 --- /dev/null +++ b/src/dota_notes/ui/images/flags/gb-nir.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gb-sct.svg b/src/dota_notes/ui/images/flags/gb-sct.svg new file mode 100644 index 0000000..f50cd32 --- /dev/null +++ b/src/dota_notes/ui/images/flags/gb-sct.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/dota_notes/ui/images/flags/gb-wls.svg b/src/dota_notes/ui/images/flags/gb-wls.svg new file mode 100644 index 0000000..6e15fd0 --- /dev/null +++ b/src/dota_notes/ui/images/flags/gb-wls.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gb.svg b/src/dota_notes/ui/images/flags/gb.svg new file mode 100644 index 0000000..dbac25e --- /dev/null +++ b/src/dota_notes/ui/images/flags/gb.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gd.svg b/src/dota_notes/ui/images/flags/gd.svg new file mode 100644 index 0000000..f44e839 --- /dev/null +++ b/src/dota_notes/ui/images/flags/gd.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ge.svg b/src/dota_notes/ui/images/flags/ge.svg new file mode 100644 index 0000000..d8126ec --- /dev/null +++ b/src/dota_notes/ui/images/flags/ge.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/gf.svg b/src/dota_notes/ui/images/flags/gf.svg new file mode 100644 index 0000000..7349342 --- /dev/null +++ b/src/dota_notes/ui/images/flags/gf.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/gg.svg b/src/dota_notes/ui/images/flags/gg.svg new file mode 100644 index 0000000..f8216c8 --- /dev/null +++ b/src/dota_notes/ui/images/flags/gg.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gh.svg b/src/dota_notes/ui/images/flags/gh.svg new file mode 100644 index 0000000..a6497de --- /dev/null +++ b/src/dota_notes/ui/images/flags/gh.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/gi.svg b/src/dota_notes/ui/images/flags/gi.svg new file mode 100644 index 0000000..92496be --- /dev/null +++ b/src/dota_notes/ui/images/flags/gi.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gl.svg b/src/dota_notes/ui/images/flags/gl.svg new file mode 100644 index 0000000..eb5a52e --- /dev/null +++ b/src/dota_notes/ui/images/flags/gl.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/dota_notes/ui/images/flags/gm.svg b/src/dota_notes/ui/images/flags/gm.svg new file mode 100644 index 0000000..8fe9d66 --- /dev/null +++ b/src/dota_notes/ui/images/flags/gm.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gn.svg b/src/dota_notes/ui/images/flags/gn.svg new file mode 100644 index 0000000..40d6ad4 --- /dev/null +++ b/src/dota_notes/ui/images/flags/gn.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gp.svg b/src/dota_notes/ui/images/flags/gp.svg new file mode 100644 index 0000000..528e554 --- /dev/null +++ b/src/dota_notes/ui/images/flags/gp.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/gq.svg b/src/dota_notes/ui/images/flags/gq.svg new file mode 100644 index 0000000..ba2acf2 --- /dev/null +++ b/src/dota_notes/ui/images/flags/gq.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gr.svg b/src/dota_notes/ui/images/flags/gr.svg new file mode 100644 index 0000000..599741e --- /dev/null +++ b/src/dota_notes/ui/images/flags/gr.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gs.svg b/src/dota_notes/ui/images/flags/gs.svg new file mode 100644 index 0000000..2e045df --- /dev/null +++ b/src/dota_notes/ui/images/flags/gs.svg @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gt.svg b/src/dota_notes/ui/images/flags/gt.svg new file mode 100644 index 0000000..9b34712 --- /dev/null +++ b/src/dota_notes/ui/images/flags/gt.svg @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gu.svg b/src/dota_notes/ui/images/flags/gu.svg new file mode 100644 index 0000000..a5584ff --- /dev/null +++ b/src/dota_notes/ui/images/flags/gu.svg @@ -0,0 +1,23 @@ + + + + + + + + + + G + U + A + M + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gw.svg b/src/dota_notes/ui/images/flags/gw.svg new file mode 100644 index 0000000..b8d566a --- /dev/null +++ b/src/dota_notes/ui/images/flags/gw.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/gy.svg b/src/dota_notes/ui/images/flags/gy.svg new file mode 100644 index 0000000..f4d9b8a --- /dev/null +++ b/src/dota_notes/ui/images/flags/gy.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/hk.svg b/src/dota_notes/ui/images/flags/hk.svg new file mode 100644 index 0000000..ec40b5f --- /dev/null +++ b/src/dota_notes/ui/images/flags/hk.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/hm.svg b/src/dota_notes/ui/images/flags/hm.svg new file mode 100644 index 0000000..c0748d3 --- /dev/null +++ b/src/dota_notes/ui/images/flags/hm.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/hn.svg b/src/dota_notes/ui/images/flags/hn.svg new file mode 100644 index 0000000..1c166dc --- /dev/null +++ b/src/dota_notes/ui/images/flags/hn.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/hr.svg b/src/dota_notes/ui/images/flags/hr.svg new file mode 100644 index 0000000..febbc24 --- /dev/null +++ b/src/dota_notes/ui/images/flags/hr.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ht.svg b/src/dota_notes/ui/images/flags/ht.svg new file mode 100644 index 0000000..4cd4470 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ht.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/hu.svg b/src/dota_notes/ui/images/flags/hu.svg new file mode 100644 index 0000000..baddf7f --- /dev/null +++ b/src/dota_notes/ui/images/flags/hu.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ic.svg b/src/dota_notes/ui/images/flags/ic.svg new file mode 100644 index 0000000..81e6ee2 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ic.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/id.svg b/src/dota_notes/ui/images/flags/id.svg new file mode 100644 index 0000000..3b7c8fc --- /dev/null +++ b/src/dota_notes/ui/images/flags/id.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/dota_notes/ui/images/flags/ie.svg b/src/dota_notes/ui/images/flags/ie.svg new file mode 100644 index 0000000..049be14 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ie.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/il.svg b/src/dota_notes/ui/images/flags/il.svg new file mode 100644 index 0000000..724cf8b --- /dev/null +++ b/src/dota_notes/ui/images/flags/il.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/im.svg b/src/dota_notes/ui/images/flags/im.svg new file mode 100644 index 0000000..3d597a1 --- /dev/null +++ b/src/dota_notes/ui/images/flags/im.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/in.svg b/src/dota_notes/ui/images/flags/in.svg new file mode 100644 index 0000000..c634f68 --- /dev/null +++ b/src/dota_notes/ui/images/flags/in.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/io.svg b/src/dota_notes/ui/images/flags/io.svg new file mode 100644 index 0000000..b04c46f --- /dev/null +++ b/src/dota_notes/ui/images/flags/io.svg @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/iq.svg b/src/dota_notes/ui/images/flags/iq.svg new file mode 100644 index 0000000..6891785 --- /dev/null +++ b/src/dota_notes/ui/images/flags/iq.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ir.svg b/src/dota_notes/ui/images/flags/ir.svg new file mode 100644 index 0000000..5c9609e --- /dev/null +++ b/src/dota_notes/ui/images/flags/ir.svg @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/is.svg b/src/dota_notes/ui/images/flags/is.svg new file mode 100644 index 0000000..56cc977 --- /dev/null +++ b/src/dota_notes/ui/images/flags/is.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/it.svg b/src/dota_notes/ui/images/flags/it.svg new file mode 100644 index 0000000..20a8bfd --- /dev/null +++ b/src/dota_notes/ui/images/flags/it.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/je.svg b/src/dota_notes/ui/images/flags/je.svg new file mode 100644 index 0000000..e69e4f4 --- /dev/null +++ b/src/dota_notes/ui/images/flags/je.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/jm.svg b/src/dota_notes/ui/images/flags/jm.svg new file mode 100644 index 0000000..e03a342 --- /dev/null +++ b/src/dota_notes/ui/images/flags/jm.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/jo.svg b/src/dota_notes/ui/images/flags/jo.svg new file mode 100644 index 0000000..5080291 --- /dev/null +++ b/src/dota_notes/ui/images/flags/jo.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/jp.svg b/src/dota_notes/ui/images/flags/jp.svg new file mode 100644 index 0000000..cd03a33 --- /dev/null +++ b/src/dota_notes/ui/images/flags/jp.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ke.svg b/src/dota_notes/ui/images/flags/ke.svg new file mode 100644 index 0000000..5b37793 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ke.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/kg.svg b/src/dota_notes/ui/images/flags/kg.svg new file mode 100644 index 0000000..626af14 --- /dev/null +++ b/src/dota_notes/ui/images/flags/kg.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/kh.svg b/src/dota_notes/ui/images/flags/kh.svg new file mode 100644 index 0000000..c658838 --- /dev/null +++ b/src/dota_notes/ui/images/flags/kh.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ki.svg b/src/dota_notes/ui/images/flags/ki.svg new file mode 100644 index 0000000..1697ffe --- /dev/null +++ b/src/dota_notes/ui/images/flags/ki.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/km.svg b/src/dota_notes/ui/images/flags/km.svg new file mode 100644 index 0000000..56d62c3 --- /dev/null +++ b/src/dota_notes/ui/images/flags/km.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/kn.svg b/src/dota_notes/ui/images/flags/kn.svg new file mode 100644 index 0000000..01a3a0a --- /dev/null +++ b/src/dota_notes/ui/images/flags/kn.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/kp.svg b/src/dota_notes/ui/images/flags/kp.svg new file mode 100644 index 0000000..94bc8e1 --- /dev/null +++ b/src/dota_notes/ui/images/flags/kp.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/kr.svg b/src/dota_notes/ui/images/flags/kr.svg new file mode 100644 index 0000000..44b51e2 --- /dev/null +++ b/src/dota_notes/ui/images/flags/kr.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/kw.svg b/src/dota_notes/ui/images/flags/kw.svg new file mode 100644 index 0000000..7ff91a8 --- /dev/null +++ b/src/dota_notes/ui/images/flags/kw.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ky.svg b/src/dota_notes/ui/images/flags/ky.svg new file mode 100644 index 0000000..d6e567b --- /dev/null +++ b/src/dota_notes/ui/images/flags/ky.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/kz.svg b/src/dota_notes/ui/images/flags/kz.svg new file mode 100644 index 0000000..a69ba7a --- /dev/null +++ b/src/dota_notes/ui/images/flags/kz.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/la.svg b/src/dota_notes/ui/images/flags/la.svg new file mode 100644 index 0000000..9723a78 --- /dev/null +++ b/src/dota_notes/ui/images/flags/la.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/lb.svg b/src/dota_notes/ui/images/flags/lb.svg new file mode 100644 index 0000000..49650ad --- /dev/null +++ b/src/dota_notes/ui/images/flags/lb.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/lc.svg b/src/dota_notes/ui/images/flags/lc.svg new file mode 100644 index 0000000..46bbc6c --- /dev/null +++ b/src/dota_notes/ui/images/flags/lc.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/li.svg b/src/dota_notes/ui/images/flags/li.svg new file mode 100644 index 0000000..a08a05a --- /dev/null +++ b/src/dota_notes/ui/images/flags/li.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/lk.svg b/src/dota_notes/ui/images/flags/lk.svg new file mode 100644 index 0000000..24c6559 --- /dev/null +++ b/src/dota_notes/ui/images/flags/lk.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/lr.svg b/src/dota_notes/ui/images/flags/lr.svg new file mode 100644 index 0000000..a31377f --- /dev/null +++ b/src/dota_notes/ui/images/flags/lr.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ls.svg b/src/dota_notes/ui/images/flags/ls.svg new file mode 100644 index 0000000..e701650 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ls.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/lt.svg b/src/dota_notes/ui/images/flags/lt.svg new file mode 100644 index 0000000..90ec5d2 --- /dev/null +++ b/src/dota_notes/ui/images/flags/lt.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/lu.svg b/src/dota_notes/ui/images/flags/lu.svg new file mode 100644 index 0000000..c31d2bf --- /dev/null +++ b/src/dota_notes/ui/images/flags/lu.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/lv.svg b/src/dota_notes/ui/images/flags/lv.svg new file mode 100644 index 0000000..6a9e75e --- /dev/null +++ b/src/dota_notes/ui/images/flags/lv.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/ly.svg b/src/dota_notes/ui/images/flags/ly.svg new file mode 100644 index 0000000..14abcb2 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ly.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ma.svg b/src/dota_notes/ui/images/flags/ma.svg new file mode 100644 index 0000000..7ce56ef --- /dev/null +++ b/src/dota_notes/ui/images/flags/ma.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/dota_notes/ui/images/flags/mc.svg b/src/dota_notes/ui/images/flags/mc.svg new file mode 100644 index 0000000..9cb6c9e --- /dev/null +++ b/src/dota_notes/ui/images/flags/mc.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/md.svg b/src/dota_notes/ui/images/flags/md.svg new file mode 100644 index 0000000..a806572 --- /dev/null +++ b/src/dota_notes/ui/images/flags/md.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/me.svg b/src/dota_notes/ui/images/flags/me.svg new file mode 100644 index 0000000..b56cce0 --- /dev/null +++ b/src/dota_notes/ui/images/flags/me.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/mf.svg b/src/dota_notes/ui/images/flags/mf.svg new file mode 100644 index 0000000..a53ce50 --- /dev/null +++ b/src/dota_notes/ui/images/flags/mf.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/mg.svg b/src/dota_notes/ui/images/flags/mg.svg new file mode 100644 index 0000000..5fa2d24 --- /dev/null +++ b/src/dota_notes/ui/images/flags/mg.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/mh.svg b/src/dota_notes/ui/images/flags/mh.svg new file mode 100644 index 0000000..46351e5 --- /dev/null +++ b/src/dota_notes/ui/images/flags/mh.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/mk.svg b/src/dota_notes/ui/images/flags/mk.svg new file mode 100644 index 0000000..4f5cae7 --- /dev/null +++ b/src/dota_notes/ui/images/flags/mk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/ml.svg b/src/dota_notes/ui/images/flags/ml.svg new file mode 100644 index 0000000..6f6b716 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ml.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/mm.svg b/src/dota_notes/ui/images/flags/mm.svg new file mode 100644 index 0000000..8ed5e6a --- /dev/null +++ b/src/dota_notes/ui/images/flags/mm.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/mn.svg b/src/dota_notes/ui/images/flags/mn.svg new file mode 100644 index 0000000..56cb072 --- /dev/null +++ b/src/dota_notes/ui/images/flags/mn.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/mo.svg b/src/dota_notes/ui/images/flags/mo.svg new file mode 100644 index 0000000..257faed --- /dev/null +++ b/src/dota_notes/ui/images/flags/mo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/mp.svg b/src/dota_notes/ui/images/flags/mp.svg new file mode 100644 index 0000000..6696fdb --- /dev/null +++ b/src/dota_notes/ui/images/flags/mp.svg @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/mq.svg b/src/dota_notes/ui/images/flags/mq.svg new file mode 100644 index 0000000..9be3452 --- /dev/null +++ b/src/dota_notes/ui/images/flags/mq.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/mr.svg b/src/dota_notes/ui/images/flags/mr.svg new file mode 100644 index 0000000..3f0a626 --- /dev/null +++ b/src/dota_notes/ui/images/flags/mr.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/ms.svg b/src/dota_notes/ui/images/flags/ms.svg new file mode 100644 index 0000000..2e6d4c5 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ms.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/mt.svg b/src/dota_notes/ui/images/flags/mt.svg new file mode 100644 index 0000000..676e801 --- /dev/null +++ b/src/dota_notes/ui/images/flags/mt.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/mu.svg b/src/dota_notes/ui/images/flags/mu.svg new file mode 100644 index 0000000..82d7a3b --- /dev/null +++ b/src/dota_notes/ui/images/flags/mu.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/mv.svg b/src/dota_notes/ui/images/flags/mv.svg new file mode 100644 index 0000000..10450f9 --- /dev/null +++ b/src/dota_notes/ui/images/flags/mv.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/mw.svg b/src/dota_notes/ui/images/flags/mw.svg new file mode 100644 index 0000000..113aae5 --- /dev/null +++ b/src/dota_notes/ui/images/flags/mw.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/mx.svg b/src/dota_notes/ui/images/flags/mx.svg new file mode 100644 index 0000000..bb305b8 --- /dev/null +++ b/src/dota_notes/ui/images/flags/mx.svg @@ -0,0 +1,382 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/my.svg b/src/dota_notes/ui/images/flags/my.svg new file mode 100644 index 0000000..264f48a --- /dev/null +++ b/src/dota_notes/ui/images/flags/my.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/mz.svg b/src/dota_notes/ui/images/flags/mz.svg new file mode 100644 index 0000000..eb02005 --- /dev/null +++ b/src/dota_notes/ui/images/flags/mz.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/na.svg b/src/dota_notes/ui/images/flags/na.svg new file mode 100644 index 0000000..799702e --- /dev/null +++ b/src/dota_notes/ui/images/flags/na.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/nc.svg b/src/dota_notes/ui/images/flags/nc.svg new file mode 100644 index 0000000..9679540 --- /dev/null +++ b/src/dota_notes/ui/images/flags/nc.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ne.svg b/src/dota_notes/ui/images/flags/ne.svg new file mode 100644 index 0000000..39a82b8 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ne.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/nf.svg b/src/dota_notes/ui/images/flags/nf.svg new file mode 100644 index 0000000..ecdb4a3 --- /dev/null +++ b/src/dota_notes/ui/images/flags/nf.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ng.svg b/src/dota_notes/ui/images/flags/ng.svg new file mode 100644 index 0000000..81eb35f --- /dev/null +++ b/src/dota_notes/ui/images/flags/ng.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/ni.svg b/src/dota_notes/ui/images/flags/ni.svg new file mode 100644 index 0000000..e16e77a --- /dev/null +++ b/src/dota_notes/ui/images/flags/ni.svg @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/nl.svg b/src/dota_notes/ui/images/flags/nl.svg new file mode 100644 index 0000000..4faaf49 --- /dev/null +++ b/src/dota_notes/ui/images/flags/nl.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/no.svg b/src/dota_notes/ui/images/flags/no.svg new file mode 100644 index 0000000..a5f2a15 --- /dev/null +++ b/src/dota_notes/ui/images/flags/no.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/np.svg b/src/dota_notes/ui/images/flags/np.svg new file mode 100644 index 0000000..fead940 --- /dev/null +++ b/src/dota_notes/ui/images/flags/np.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/nr.svg b/src/dota_notes/ui/images/flags/nr.svg new file mode 100644 index 0000000..e71ddcd --- /dev/null +++ b/src/dota_notes/ui/images/flags/nr.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/nu.svg b/src/dota_notes/ui/images/flags/nu.svg new file mode 100644 index 0000000..4067baf --- /dev/null +++ b/src/dota_notes/ui/images/flags/nu.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/nz.svg b/src/dota_notes/ui/images/flags/nz.svg new file mode 100644 index 0000000..04d08dc --- /dev/null +++ b/src/dota_notes/ui/images/flags/nz.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/om.svg b/src/dota_notes/ui/images/flags/om.svg new file mode 100644 index 0000000..1c76217 --- /dev/null +++ b/src/dota_notes/ui/images/flags/om.svg @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/pa.svg b/src/dota_notes/ui/images/flags/pa.svg new file mode 100644 index 0000000..8dc03bc --- /dev/null +++ b/src/dota_notes/ui/images/flags/pa.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/pe.svg b/src/dota_notes/ui/images/flags/pe.svg new file mode 100644 index 0000000..b30df9a --- /dev/null +++ b/src/dota_notes/ui/images/flags/pe.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/dota_notes/ui/images/flags/pf.svg b/src/dota_notes/ui/images/flags/pf.svg new file mode 100644 index 0000000..16374f3 --- /dev/null +++ b/src/dota_notes/ui/images/flags/pf.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/pg.svg b/src/dota_notes/ui/images/flags/pg.svg new file mode 100644 index 0000000..1080add --- /dev/null +++ b/src/dota_notes/ui/images/flags/pg.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ph.svg b/src/dota_notes/ui/images/flags/ph.svg new file mode 100644 index 0000000..65489e1 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ph.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/pk.svg b/src/dota_notes/ui/images/flags/pk.svg new file mode 100644 index 0000000..fa02f6a --- /dev/null +++ b/src/dota_notes/ui/images/flags/pk.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/pl.svg b/src/dota_notes/ui/images/flags/pl.svg new file mode 100644 index 0000000..0fa5145 --- /dev/null +++ b/src/dota_notes/ui/images/flags/pl.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/pm.svg b/src/dota_notes/ui/images/flags/pm.svg new file mode 100644 index 0000000..401139f --- /dev/null +++ b/src/dota_notes/ui/images/flags/pm.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/pn.svg b/src/dota_notes/ui/images/flags/pn.svg new file mode 100644 index 0000000..9788c9c --- /dev/null +++ b/src/dota_notes/ui/images/flags/pn.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/pr.svg b/src/dota_notes/ui/images/flags/pr.svg new file mode 100644 index 0000000..3cb403b --- /dev/null +++ b/src/dota_notes/ui/images/flags/pr.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ps.svg b/src/dota_notes/ui/images/flags/ps.svg new file mode 100644 index 0000000..8203148 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ps.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/pt.svg b/src/dota_notes/ui/images/flags/pt.svg new file mode 100644 index 0000000..2f36b7e --- /dev/null +++ b/src/dota_notes/ui/images/flags/pt.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/pw.svg b/src/dota_notes/ui/images/flags/pw.svg new file mode 100644 index 0000000..089cbce --- /dev/null +++ b/src/dota_notes/ui/images/flags/pw.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/py.svg b/src/dota_notes/ui/images/flags/py.svg new file mode 100644 index 0000000..bfbf01f --- /dev/null +++ b/src/dota_notes/ui/images/flags/py.svg @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/qa.svg b/src/dota_notes/ui/images/flags/qa.svg new file mode 100644 index 0000000..bd493c3 --- /dev/null +++ b/src/dota_notes/ui/images/flags/qa.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/dota_notes/ui/images/flags/re.svg b/src/dota_notes/ui/images/flags/re.svg new file mode 100644 index 0000000..3225ddd --- /dev/null +++ b/src/dota_notes/ui/images/flags/re.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/ro.svg b/src/dota_notes/ui/images/flags/ro.svg new file mode 100644 index 0000000..fda0f7b --- /dev/null +++ b/src/dota_notes/ui/images/flags/ro.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/rs.svg b/src/dota_notes/ui/images/flags/rs.svg new file mode 100644 index 0000000..120293a --- /dev/null +++ b/src/dota_notes/ui/images/flags/rs.svg @@ -0,0 +1,292 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ru.svg b/src/dota_notes/ui/images/flags/ru.svg new file mode 100644 index 0000000..f4d27ef --- /dev/null +++ b/src/dota_notes/ui/images/flags/ru.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/rw.svg b/src/dota_notes/ui/images/flags/rw.svg new file mode 100644 index 0000000..6cc669e --- /dev/null +++ b/src/dota_notes/ui/images/flags/rw.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sa.svg b/src/dota_notes/ui/images/flags/sa.svg new file mode 100644 index 0000000..660396a --- /dev/null +++ b/src/dota_notes/ui/images/flags/sa.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sb.svg b/src/dota_notes/ui/images/flags/sb.svg new file mode 100644 index 0000000..a011360 --- /dev/null +++ b/src/dota_notes/ui/images/flags/sb.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sc.svg b/src/dota_notes/ui/images/flags/sc.svg new file mode 100644 index 0000000..9a46b36 --- /dev/null +++ b/src/dota_notes/ui/images/flags/sc.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sd.svg b/src/dota_notes/ui/images/flags/sd.svg new file mode 100644 index 0000000..b8e4b97 --- /dev/null +++ b/src/dota_notes/ui/images/flags/sd.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/se.svg b/src/dota_notes/ui/images/flags/se.svg new file mode 100644 index 0000000..0e41780 --- /dev/null +++ b/src/dota_notes/ui/images/flags/se.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/dota_notes/ui/images/flags/sg.svg b/src/dota_notes/ui/images/flags/sg.svg new file mode 100644 index 0000000..c4dd4ac --- /dev/null +++ b/src/dota_notes/ui/images/flags/sg.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sh.svg b/src/dota_notes/ui/images/flags/sh.svg new file mode 100644 index 0000000..131b069 --- /dev/null +++ b/src/dota_notes/ui/images/flags/sh.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/si.svg b/src/dota_notes/ui/images/flags/si.svg new file mode 100644 index 0000000..f2aea01 --- /dev/null +++ b/src/dota_notes/ui/images/flags/si.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sj.svg b/src/dota_notes/ui/images/flags/sj.svg new file mode 100644 index 0000000..bb2799c --- /dev/null +++ b/src/dota_notes/ui/images/flags/sj.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sk.svg b/src/dota_notes/ui/images/flags/sk.svg new file mode 100644 index 0000000..a1953fa --- /dev/null +++ b/src/dota_notes/ui/images/flags/sk.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sl.svg b/src/dota_notes/ui/images/flags/sl.svg new file mode 100644 index 0000000..a07baf7 --- /dev/null +++ b/src/dota_notes/ui/images/flags/sl.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sm.svg b/src/dota_notes/ui/images/flags/sm.svg new file mode 100644 index 0000000..0892990 --- /dev/null +++ b/src/dota_notes/ui/images/flags/sm.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sn.svg b/src/dota_notes/ui/images/flags/sn.svg new file mode 100644 index 0000000..7c0673d --- /dev/null +++ b/src/dota_notes/ui/images/flags/sn.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/so.svg b/src/dota_notes/ui/images/flags/so.svg new file mode 100644 index 0000000..ae582f1 --- /dev/null +++ b/src/dota_notes/ui/images/flags/so.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sr.svg b/src/dota_notes/ui/images/flags/sr.svg new file mode 100644 index 0000000..5e71c40 --- /dev/null +++ b/src/dota_notes/ui/images/flags/sr.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/ss.svg b/src/dota_notes/ui/images/flags/ss.svg new file mode 100644 index 0000000..73804d8 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ss.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/st.svg b/src/dota_notes/ui/images/flags/st.svg new file mode 100644 index 0000000..f2e75c1 --- /dev/null +++ b/src/dota_notes/ui/images/flags/st.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sv.svg b/src/dota_notes/ui/images/flags/sv.svg new file mode 100644 index 0000000..3a63913 --- /dev/null +++ b/src/dota_notes/ui/images/flags/sv.svg @@ -0,0 +1,594 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sx.svg b/src/dota_notes/ui/images/flags/sx.svg new file mode 100644 index 0000000..84844e0 --- /dev/null +++ b/src/dota_notes/ui/images/flags/sx.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/sy.svg b/src/dota_notes/ui/images/flags/sy.svg new file mode 100644 index 0000000..29636ae --- /dev/null +++ b/src/dota_notes/ui/images/flags/sy.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/sz.svg b/src/dota_notes/ui/images/flags/sz.svg new file mode 100644 index 0000000..5eef691 --- /dev/null +++ b/src/dota_notes/ui/images/flags/sz.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ta.svg b/src/dota_notes/ui/images/flags/ta.svg new file mode 100644 index 0000000..b68ad23 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ta.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/tc.svg b/src/dota_notes/ui/images/flags/tc.svg new file mode 100644 index 0000000..89d29bb --- /dev/null +++ b/src/dota_notes/ui/images/flags/tc.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/td.svg b/src/dota_notes/ui/images/flags/td.svg new file mode 100644 index 0000000..fa3bd92 --- /dev/null +++ b/src/dota_notes/ui/images/flags/td.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/tf.svg b/src/dota_notes/ui/images/flags/tf.svg new file mode 100644 index 0000000..88323d2 --- /dev/null +++ b/src/dota_notes/ui/images/flags/tf.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/tg.svg b/src/dota_notes/ui/images/flags/tg.svg new file mode 100644 index 0000000..e20f40d --- /dev/null +++ b/src/dota_notes/ui/images/flags/tg.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/th.svg b/src/dota_notes/ui/images/flags/th.svg new file mode 100644 index 0000000..1e93a61 --- /dev/null +++ b/src/dota_notes/ui/images/flags/th.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/tj.svg b/src/dota_notes/ui/images/flags/tj.svg new file mode 100644 index 0000000..d2ba733 --- /dev/null +++ b/src/dota_notes/ui/images/flags/tj.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/tk.svg b/src/dota_notes/ui/images/flags/tk.svg new file mode 100644 index 0000000..65bab13 --- /dev/null +++ b/src/dota_notes/ui/images/flags/tk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/tl.svg b/src/dota_notes/ui/images/flags/tl.svg new file mode 100644 index 0000000..bcfc161 --- /dev/null +++ b/src/dota_notes/ui/images/flags/tl.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/tm.svg b/src/dota_notes/ui/images/flags/tm.svg new file mode 100644 index 0000000..08792a7 --- /dev/null +++ b/src/dota_notes/ui/images/flags/tm.svg @@ -0,0 +1,205 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/tn.svg b/src/dota_notes/ui/images/flags/tn.svg new file mode 100644 index 0000000..6a1989b --- /dev/null +++ b/src/dota_notes/ui/images/flags/tn.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/dota_notes/ui/images/flags/to.svg b/src/dota_notes/ui/images/flags/to.svg new file mode 100644 index 0000000..d072337 --- /dev/null +++ b/src/dota_notes/ui/images/flags/to.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/tr.svg b/src/dota_notes/ui/images/flags/tr.svg new file mode 100644 index 0000000..a92804f --- /dev/null +++ b/src/dota_notes/ui/images/flags/tr.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/tt.svg b/src/dota_notes/ui/images/flags/tt.svg new file mode 100644 index 0000000..14adbe0 --- /dev/null +++ b/src/dota_notes/ui/images/flags/tt.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/tv.svg b/src/dota_notes/ui/images/flags/tv.svg new file mode 100644 index 0000000..675210e --- /dev/null +++ b/src/dota_notes/ui/images/flags/tv.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/tw.svg b/src/dota_notes/ui/images/flags/tw.svg new file mode 100644 index 0000000..57fd98b --- /dev/null +++ b/src/dota_notes/ui/images/flags/tw.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/tz.svg b/src/dota_notes/ui/images/flags/tz.svg new file mode 100644 index 0000000..751c167 --- /dev/null +++ b/src/dota_notes/ui/images/flags/tz.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ua.svg b/src/dota_notes/ui/images/flags/ua.svg new file mode 100644 index 0000000..a339eb1 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ua.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dota_notes/ui/images/flags/ug.svg b/src/dota_notes/ui/images/flags/ug.svg new file mode 100644 index 0000000..78252a4 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ug.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/um.svg b/src/dota_notes/ui/images/flags/um.svg new file mode 100644 index 0000000..e041594 --- /dev/null +++ b/src/dota_notes/ui/images/flags/um.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/un.svg b/src/dota_notes/ui/images/flags/un.svg new file mode 100644 index 0000000..e475337 --- /dev/null +++ b/src/dota_notes/ui/images/flags/un.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/us.svg b/src/dota_notes/ui/images/flags/us.svg new file mode 100644 index 0000000..615946d --- /dev/null +++ b/src/dota_notes/ui/images/flags/us.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/uy.svg b/src/dota_notes/ui/images/flags/uy.svg new file mode 100644 index 0000000..4a54b85 --- /dev/null +++ b/src/dota_notes/ui/images/flags/uy.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/uz.svg b/src/dota_notes/ui/images/flags/uz.svg new file mode 100644 index 0000000..aaf9382 --- /dev/null +++ b/src/dota_notes/ui/images/flags/uz.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/va.svg b/src/dota_notes/ui/images/flags/va.svg new file mode 100644 index 0000000..c7d8791 --- /dev/null +++ b/src/dota_notes/ui/images/flags/va.svg @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/vc.svg b/src/dota_notes/ui/images/flags/vc.svg new file mode 100644 index 0000000..450f6f0 --- /dev/null +++ b/src/dota_notes/ui/images/flags/vc.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/ve.svg b/src/dota_notes/ui/images/flags/ve.svg new file mode 100644 index 0000000..314e7f5 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ve.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/vg.svg b/src/dota_notes/ui/images/flags/vg.svg new file mode 100644 index 0000000..4d2c397 --- /dev/null +++ b/src/dota_notes/ui/images/flags/vg.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/vi.svg b/src/dota_notes/ui/images/flags/vi.svg new file mode 100644 index 0000000..3a64338 --- /dev/null +++ b/src/dota_notes/ui/images/flags/vi.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/vn.svg b/src/dota_notes/ui/images/flags/vn.svg new file mode 100644 index 0000000..24bedc5 --- /dev/null +++ b/src/dota_notes/ui/images/flags/vn.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/vu.svg b/src/dota_notes/ui/images/flags/vu.svg new file mode 100644 index 0000000..efcff89 --- /dev/null +++ b/src/dota_notes/ui/images/flags/vu.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/wf.svg b/src/dota_notes/ui/images/flags/wf.svg new file mode 100644 index 0000000..57feb3a --- /dev/null +++ b/src/dota_notes/ui/images/flags/wf.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/ws.svg b/src/dota_notes/ui/images/flags/ws.svg new file mode 100644 index 0000000..0e758a7 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ws.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/xk.svg b/src/dota_notes/ui/images/flags/xk.svg new file mode 100644 index 0000000..de6ef4d --- /dev/null +++ b/src/dota_notes/ui/images/flags/xk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/xx.svg b/src/dota_notes/ui/images/flags/xx.svg new file mode 100644 index 0000000..9333be3 --- /dev/null +++ b/src/dota_notes/ui/images/flags/xx.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/dota_notes/ui/images/flags/ye.svg b/src/dota_notes/ui/images/flags/ye.svg new file mode 100644 index 0000000..61f0ed6 --- /dev/null +++ b/src/dota_notes/ui/images/flags/ye.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/dota_notes/ui/images/flags/yt.svg b/src/dota_notes/ui/images/flags/yt.svg new file mode 100644 index 0000000..5ea2f64 --- /dev/null +++ b/src/dota_notes/ui/images/flags/yt.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/dota_notes/ui/images/flags/za.svg b/src/dota_notes/ui/images/flags/za.svg new file mode 100644 index 0000000..aa54beb --- /dev/null +++ b/src/dota_notes/ui/images/flags/za.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/zm.svg b/src/dota_notes/ui/images/flags/zm.svg new file mode 100644 index 0000000..b8fdd63 --- /dev/null +++ b/src/dota_notes/ui/images/flags/zm.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/flags/zw.svg b/src/dota_notes/ui/images/flags/zw.svg new file mode 100644 index 0000000..5c19746 --- /dev/null +++ b/src/dota_notes/ui/images/flags/zw.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dota_notes/ui/images/history.svg b/src/dota_notes/ui/images/history.svg new file mode 100644 index 0000000..3dfff5d --- /dev/null +++ b/src/dota_notes/ui/images/history.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/dota_notes/ui/images/note.svg b/src/dota_notes/ui/images/note.svg new file mode 100644 index 0000000..64740c6 --- /dev/null +++ b/src/dota_notes/ui/images/note.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/dota_notes/ui/images/person_search.svg b/src/dota_notes/ui/images/person_search.svg new file mode 100644 index 0000000..6135ccd --- /dev/null +++ b/src/dota_notes/ui/images/person_search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/dota_notes/ui/images/public.svg b/src/dota_notes/ui/images/public.svg new file mode 100644 index 0000000..c00b531 --- /dev/null +++ b/src/dota_notes/ui/images/public.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/dota_notes/ui/images/smurf.png b/src/dota_notes/ui/images/smurf.png new file mode 100644 index 0000000000000000000000000000000000000000..6e0f5b5ea4d0a79f9beb9fc8486c00c8a3599b4f GIT binary patch literal 2951 zcmV;23wZR2P)nO2U3@j3f$gidLq3DF7zday?4>z5Gf2M&sV3;--=Y1ZB zbl3a*bSR852;W00o#}DKgjF*Hb@g>H3@uQUaddYaMSE*2yi6CobUJspZR*er3sROA z5Pb$fihG$9GM)$;B6YZA-a<5t7=h-dv1pz+1;d9ALH(c@EE8Y=NVRy}!Tv*?*n6-Y zEjvHNmNz!xz3uNI-P!^;9&FQqW|&0-VRdzNB~4;d98w^WOsVrBlV;+&TkgWbD=x#l z#u}w)sj{OBczN9mSpC?;X#H?=V2?5iFYSy#D1<-&Xd)MLM59q@TPF1=s~V=rmCw8) z+hk91rIfxD>PJc;MB#N29=Q*G?ozvya`~DUWYyS<)EGL0jKyNT>PEVk1fZJ8s(!ppO_~#Q3VCi4~uG%TY89ROdMFU7t#xN?d@=uRps75V5 zBqSK`OVsxwjKP5kR|X0A_cvdOhhEwO*h7#=Byc(mMFS8*V0iNsESlP&&OK;g#Xnvw z0$7mHsb2-c$4?i{!kX8&0kDurBv0`~Ng70=Hk9!ppiy>^{b>DMII$q6mwzxy7-Jdute;s3EBL2A1X)zzk3U|3nM+o{aXt9H z7Xa`@@c`^H8*W!C?z!#GYzrWGkf%$mp2Z6FN;Y!C{vUtjJ{aZoNT&lY(4^O*(dcr= zan9N$V_bRRz^6N~{Rqd^SIvRVSkMufO8v^bJd*{Le_mS1k@A8`Wgm?R)S4V!)no9^ z#^+R&8HQb2A)|b389b;3(=V56H*e3&-foc9MNqtiDrUaQ@j}pNFRT~&$JuL#D6D?6 zRZ1Bf+NgA>9#AWL^#Fy26rRdHWC9{%)TZeM42`4h%iY-U)M~u_MF;HRlTkmU5|OMY z$TR9E{H)HiwIV;<*jc^83ht9A2gBYI8g^{nh%&pZkP9h-=A@BvgFLK-kBRUgi9{l~ zERaql0?KUEVAS+Em_2(gnwuLjZfG?c8yiqzM-jC&IKGc$%7xAt23C|o=N!BbG+Igz zjOlpuU>cW=u0zz!BXgt_6$_F{^RB_r3ob|5fUy7#1{X(K-bBkk*5UBMz0et8M`I8| zf-#A7B3Z!wYe!GQk_TT!n>`qr&NS@w0Su~?m^04Ax0=oaC)4y&SX}!-F9W>pAk~wxB4t3l&B3S7{SKQ}EmwgMjm6-5u38Ha zFQ0hjcQ9hc^{7054$@XF4tAt)VSNhMj$xQExE$qWdY{;84;U&gezN=#Jp14>@@ioD zs>&KHUcD7nP3NI)7vOmwq^3g;L$=EUtZEZe@BKBZ8zx}Gz1QYea*Z<RIu3_+0j6|=Ny`{` zSZ&D*ZbqW>D8uMWn_wj}Xy5$-rvKo#`1bNgVGbLK6MKQfhf{F6Q~3Esz}4f+mGX-3 zG2TDcCyK#1I$RUaKm9aVth`({%~*{24?l%Np9!U~!x=Q93xe!+aWAq-G&91OjB!XG|XHKCk=2? zm@%a|rM;f@l_n2ak!OG|$zfI0LmmS>=|i(L966H4l1Zez;@WCr8~vhqR+v(r#3E%i zfUDE;TAc8R?*zG|XDuxR5rh--04E`lCR(j=bRHMDxIT{WPPUZYh3tQ>+7k>3CzaF3 zT4Aula4ANz6vFiwO#cLKnqopj1dwLXeLu6+eDO$eAyw2M`Q-?xWA48agj_?Xln(Nt@PH?uH+M9z=07mt=I**+Z41v~++agL8)e+C^bClDJ3NY7KK zbXu~oG`RAMP?NgntdLwHMP73gnBOQ0U=sP0K`=ptjP=|Bh+HE15L1T`-(PPK0JfPpnBBB5H*A0J5r_80D;Kklnfcha5Uq?>*&U` zAujHjUxg~e0AyNiH&PMmv;9>K;P}_RIOaBuK!xs{%0{ycljRWrKXl&Wl`muXf`#Zh zNEEwJ5y=7yPN~?ClwJ)S=#rRJ*@hMKDp3)!gI$bpRb9IBGV~t9kM4gGtC!u3+JQBN zd6RCkA`wNIEz1NmG-!qfJsi^)EL=UF8V58dg3cIRrYpueVgSR=?rN;qbOLc#1j(0$^Qo)YL*(AFl*Mvk}jfGdgF!1(1 zM?K7Q%(PfvxXL)6bOVq7W~pkSl_5&uSX3|ezyBKIEv<+QBqMuj0{12?oEHw)P(j?q zs>ZsH1*A+U5JJs}GXuyLzbyZ`_2xU^9Y26F+s^G;7r(7y+eoH8eDwSZLiQseqf?(Bf#{+Azb^W6-O#@sz83IKEpw4tn!;aUUMA!EH zs2<6Ya)LS_&)^9XKh(rym3Y66hICX#JzGi0hT8q>x8c!WeqSkTnuTw1N}2a zi&%QY9Ho3L8a+k%k^vwLC8`s9KiPt{-HEEA78~xmTO35$z3Lehe zOPV-s9>!gF7Y1Fp5EXSm(gjip#dzUo07n8-&jWrorLYfDZR?(6_}j+U@bu%WaQNf5 z0s|HKlJA@VWI_0zqnIek;8Ei+cE&ZRZJveL&?ZC&kA_a06Rn4F)i=^;sIt)7k-?rl zU!i5!E^L2i8{T^LB_MfNJ#SkEG`+ajto;HYABdn$u1pZ)6crT_6V=0;P(Ek~j_==% z&W?5@eGS5uK<0SC^JTWB=u0Uty89JCPZ7QkH`Dvq4Gf(_*UfYOs=?R)%N~OU)gzJk x|N6R(FX$lNMC)l<4KnCDk-(EeAsUTF@jqz7@nN0UqNo4>002ovPDHLkV1gI;fDr%y literal 0 HcmV?d00001 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>