This commit is contained in:
Eriks Karls 2020-01-02 13:22:26 +02:00
parent 25ec54994e
commit 3e3071b185
3 changed files with 51 additions and 21 deletions

33
db.py
View File

@ -14,22 +14,32 @@ class DiscordDB:
self._db = Database(memory=True) self._db = Database(memory=True)
else: else:
self._db = Database(self._name) self._db = Database(self._name)
self._db.create_table("member", {"id": int, "name": str, "mention_number": int}, if "member" not in self._db.table_names():
pk="id", not_null={"id", "name", "mention_number"}) self._db.create_table("member", {"id": int, "name": str, "mention_number": int},
pk="id", not_null={"id", "name", "mention_number"})
self._db.create_table("player", {"id": int, "name": str}, pk="id", not_null={"id", "name"}) if "player" not in self._db.table_names():
self._db.create_table("player", {"id": int, "name": str}, pk="id", not_null={"id", "name"})
self._db.create_table("hunted", {"id": int, "member_id": int, "player_id": int}, if "hunted" not in self._db.table_names():
pk="id", not_null={"id", "member_id", "player_id"}) self._db.create_table("hunted", {"id": int, "member_id": int, "player_id": int},
pk="id", not_null={"id", "member_id", "player_id"})
self._db['hunted'].create_index(["member_id", "player_id"], unique=True)
self._db.create_table("medals", not_null={"id", "player_id", "battle_id", "division_id", "side_id", "damage"}, if "medals" not in self._db.table_names():
columns=dict(id=int, player_id=int, battle_id=int, division_id=int, side_id=int, self._db.create_table("medals",
damage=int), pk="id", defaults={"damage": 0}) dict(id=int, player_id=int, battle_id=int, division_id=int, side_id=int, damage=int),
self._db.create_view("hunted_players", "select distinct player_id from hunted") not_null={"id", "player_id", "battle_id", "division_id", "side_id", "damage"},
pk="id", defaults={"damage": 0})
self._db['medals'].create_index(["player_id", "battle_id", "division_id", "side_id"], unique=True)
if "hunted_players" not in self._db.view_names():
self._db.create_view("hunted_players", "select distinct player_id from hunted")
self._db.add_foreign_keys([("hunted", "member_id", "member", "id"), self._db.add_foreign_keys([("hunted", "member_id", "member", "id"),
("hunted", "player_id", "player", "id"), ("hunted", "player_id", "player", "id"),
("medals", "player_id", "player", "id")]) ("medals", "player_id", "player", "id")])
self._db.vacuum()
self.member = self._db.table("member") self.member = self._db.table("member")
self.player = self._db.table("player") self.player = self._db.table("player")
@ -37,9 +47,6 @@ class DiscordDB:
self.medals = self._db.table("medals") self.medals = self._db.table("medals")
self.hunted_players = self._db.table("hunted_players") self.hunted_players = self._db.table("hunted_players")
self.medals.create_index(["player_id", "battle_id", "division_id", "side_id"], unique=True)
self.hunted.create_index(["member_id", "player_id"], unique=True)
# Player methods # Player methods
def get_player(self, pid: int) -> Union[Dict[str, Union[int, str]], None]: def get_player(self, pid: int) -> Union[Dict[str, Union[int, str]], None]:
@ -159,7 +166,7 @@ class DiscordDB:
return True return True
def delete_medals(self, bid: List[int]): def delete_medals(self, bid: List[int]):
self.medals.delete_where("battle_id in (%s)" % "?"*len(bid), bid) self.medals.delete_where("battle_id in (%s)" % "?" * len(bid), bid)
return True return True
def check_hunt(self, pid: int, member_id: int) -> bool: def check_hunt(self, pid: int, member_id: int) -> bool:

View File

@ -31,6 +31,17 @@ COUNTRIES = {1: 'Romania', 9: 'Brazil', 10: 'Italy', 11: 'France', 12: 'Germany'
78: 'Colombia', 79: 'Republic of Macedonia (FYROM)', 80: 'Montenegro', 81: 'Republic of China (Taiwan)', 78: 'Colombia', 79: 'Republic of Macedonia (FYROM)', 80: 'Montenegro', 81: 'Republic of China (Taiwan)',
82: 'Cyprus', 83: 'Belarus', 84: 'New Zealand', 164: 'Saudi Arabia', 165: 'Egypt', 82: 'Cyprus', 83: 'Belarus', 84: 'New Zealand', 164: 'Saudi Arabia', 165: 'Egypt',
166: 'United Arab Emirates', 167: 'Albania', 168: 'Georgia', 169: 'Armenia', 170: 'Nigeria', 171: 'Cuba'} 166: 'United Arab Emirates', 167: 'Albania', 168: 'Georgia', 169: 'Armenia', 170: 'Nigeria', 171: 'Cuba'}
FLAGS = {1: 'flag_ro', 9: 'flag_br', 10: 'flag_it', 11: 'flag_fr', 12: 'flag_de', 13: 'flag_hu', 14: 'flag_cn',
15: 'flag_sp', 23: 'flag_ca', 24: 'flag_us', 26: 'flag_mx', 27: 'flag_ar', 28: 'flag_ve', 29: 'flag_gb',
30: 'flag_ch', 31: 'flag_nl', 32: 'flag_be', 33: 'flag_at', 34: 'flag_cz', 35: 'flag_pl', 36: 'flag_sk',
37: 'flag_no', 38: 'flag_se', 39: 'flag_fi', 40: 'flag_ua', 41: 'flag_ru', 42: 'flag_bg', 43: 'flag_tr',
44: 'flag_gr', 45: 'flag_jp', 47: 'flag_sk', 48: 'flag_in', 49: 'flag_id', 50: 'flag_au', 51: 'flag_za',
52: 'flag_md', 53: 'flag_pt', 54: 'flag_ie', 55: 'flag_de', 56: 'flag_ir', 57: 'flag_pk', 58: 'flag_il',
59: 'flag_th', 61: 'flag_si', 63: 'flag_hr', 64: 'flag_cl', 65: 'flag_sr', 66: 'flag_my', 67: 'flag_ph',
68: 'flag_sg', 69: 'flag_ba', 70: 'flag_ee', 71: 'flag_lv', 72: 'flag_lt', 73: 'flag_kp', 74: 'flag_uy',
75: 'flag_py', 76: 'flag_bo', 77: 'flag_pe', 78: 'flag_co', 79: 'flag_mk', 80: 'flag_me', 81: 'flag_tw',
82: 'flag_cy', 83: 'flag_by', 84: 'flag_nz', 164: 'flag_sa', 165: 'flag_eg', 166: 'flag_ae', 167: 'flag_al',
168: 'flag_ge', 169: 'flag_am', 170: 'flag_ng', 171: 'flag_cu'}
__last_battle_request = None __last_battle_request = None
@ -71,10 +82,13 @@ def get_medals(division: int):
for division_data in battle.get('div', {}).values(): for division_data in battle.get('div', {}).values():
if not division_data.get('end') and division_data.get('div') == division: if not division_data.get('end') and division_data.get('div') == division:
for side, stat in division_data['stats'].items(): for side, stat in division_data['stats'].items():
data = dict(id=battle.get('id'), country_id=battle.get(side).get('id'),
time=request_time - start_time, dmg=0)
if stat: if stat:
yield dict( data.update(dmg=division_data['stats'][side]['damage'])
id=battle.get('id'), country=COUNTRIES[battle.get('inv').get('id')], yield data
dmg=division_data['stats'][side]['damage'], time=request_time - start_time) else:
yield data
class MyClient(discord.Client): class MyClient(discord.Client):
@ -99,10 +113,8 @@ class MyClient(discord.Client):
async def report_medal(self, pid: int, bid: int, div: int, side: int, dmg: int, region_name: str): async def report_medal(self, pid: int, bid: int, div: int, side: int, dmg: int, region_name: str):
for member in DB.get_members_to_notify(pid): for member in DB.get_members_to_notify(pid):
format_data = dict(author=member, player=DB.get_player(pid)['name'], battle=bid, format_data = dict(author=member, player=DB.get_player(pid)['name'], battle=bid, region=region_name,
region=region_name, division=div, dmg=dmg, side=COUNTRIES[side])
division=div, dmg=dmg,
side=COUNTRIES[side])
await self.get_channel(603527159109124096).send( await self.get_channel(603527159109124096).send(
"<@{author}> {player} detected in battle for {region} on {side} side in d{division} with {dmg:,d}dmg\n" "<@{author}> {player} detected in battle for {region} on {side} side in d{division} with {dmg:,d}dmg\n"
"https://www.erepublik.com/en/military/battlefield/{battle}".format(**format_data) "https://www.erepublik.com/en/military/battlefield/{battle}".format(**format_data)
@ -193,12 +205,14 @@ if __name__ == "__main__":
cheap_bhs = [] # Battle id, Side, damage, round time cheap_bhs = [] # Battle id, Side, damage, round time
for division_data in get_medals(division): for division_data in get_medals(division):
if division_data['dmg'] < damage: if division_data['dmg'] < damage:
division_data['flag'] = FLAGS[division_data['country_id']]
division_data['country'] = COUNTRIES[division_data['country_id']]
cheap_bhs.append(division_data) cheap_bhs.append(division_data)
if cheap_bhs: if cheap_bhs:
cheap_bhs = sorted(cheap_bhs, key=lambda _: _['time']) cheap_bhs = sorted(cheap_bhs, key=lambda _: _['time'])
cheap_bhs.reverse() cheap_bhs.reverse()
msg = "\n".join(["{dmg:,d}dmg medal for {country}, {time} round time " msg = "\n".join(["{dmg:,d}dmg for :{flag}: {country}, {time} round time "
"https://www.erepublik.com/en/military/battlefield/{id}".format(**bh) for bh in cheap_bhs]) "https://www.erepublik.com/en/military/battlefield/{id}".format(**bh) for bh in cheap_bhs])
if len(msg) > 2000: if len(msg) > 2000:
msg = "\n".join(msg[:2000].split('\n')[:-1]) msg = "\n".join(msg[:2000].split('\n')[:-1])

9
run.sh Normal file
View File

@ -0,0 +1,9 @@
#!/bin/bash
source venv/bin/activate
echo "Checking queries..."
python -m unittest
echo "Starting Discord bot..."
python discord_bot.py &
sleep 10
disown -h %1
echo "Done!"