2018-09-17 22:07:00 +00:00
|
|
|
import db
|
|
|
|
import time
|
|
|
|
import logging
|
|
|
|
import raven
|
|
|
|
import configparser
|
|
|
|
import os
|
|
|
|
import typing
|
2019-01-02 20:10:54 +00:00
|
|
|
# python-telegram-bot has a different name
|
|
|
|
# noinspection PyPackageRequirements
|
2018-09-17 22:07:00 +00:00
|
|
|
import telegram
|
|
|
|
import sys
|
2018-09-17 22:26:01 +00:00
|
|
|
import coloredlogs
|
2019-01-02 18:37:05 +00:00
|
|
|
import requests
|
2019-01-23 14:00:30 +00:00
|
|
|
from dirty import Dirty, DirtyDelta
|
2019-01-02 18:37:05 +00:00
|
|
|
from sentry_sdk import configure_scope
|
2018-09-17 22:07:00 +00:00
|
|
|
|
2018-09-18 22:02:39 +00:00
|
|
|
logging.getLogger().disabled = True
|
2018-09-17 22:07:00 +00:00
|
|
|
logger = logging.getLogger(__name__)
|
2018-09-18 22:13:41 +00:00
|
|
|
os.environ["COLOREDLOGS_LOG_FORMAT"] = "%(asctime)s %(levelname)s %(name)s %(message)s"
|
2018-09-17 22:26:01 +00:00
|
|
|
coloredlogs.install(level="DEBUG", logger=logger)
|
2018-09-17 22:07:00 +00:00
|
|
|
|
|
|
|
# Init the config reader
|
|
|
|
config = configparser.ConfigParser()
|
|
|
|
config.read("config.ini")
|
|
|
|
|
|
|
|
# Init the Sentry client
|
|
|
|
sentry = raven.Client(config["Sentry"]["token"],
|
|
|
|
release=raven.fetch_git_sha(os.path.dirname(__file__)),
|
|
|
|
install_logging_hook=False,
|
|
|
|
hook_libraries=[])
|
|
|
|
|
|
|
|
telegram_bot = telegram.Bot(config["Telegram"]["bot_token"])
|
|
|
|
|
|
|
|
|
2018-10-07 22:42:45 +00:00
|
|
|
def update_block(session: db.Session, block: list, delay: float=0, change_callback: typing.Callable=None):
|
2018-09-17 22:07:00 +00:00
|
|
|
for item in block:
|
|
|
|
logger.debug(f"Updating {repr(item)}.")
|
|
|
|
t = time.clock()
|
|
|
|
try:
|
2018-10-07 22:42:45 +00:00
|
|
|
change = item.update(session=session)
|
2019-01-02 18:37:05 +00:00
|
|
|
except requests.exceptions.HTTPError as e:
|
|
|
|
with configure_scope() as scope:
|
|
|
|
if str(e.response.status_code).startswith("5"):
|
|
|
|
scope.level = "warning"
|
|
|
|
logger.warning(f"Server error {sys.exc_info()} while updating {repr(item)}.")
|
|
|
|
else:
|
|
|
|
scope.level = "error"
|
|
|
|
logger.error(f"Error {sys.exc_info()} while updating {repr(item)}.")
|
|
|
|
sentry.extra_context({
|
|
|
|
"item": repr(item),
|
|
|
|
"response": {
|
|
|
|
"code": e.response.status_code,
|
|
|
|
"text": e.response.text
|
|
|
|
}
|
|
|
|
})
|
|
|
|
sentry.captureException()
|
|
|
|
continue
|
2019-01-02 20:10:54 +00:00
|
|
|
except Exception:
|
2018-11-07 18:41:49 +00:00
|
|
|
logger.warning(f"Error {sys.exc_info()} while updating {repr(item)}.")
|
2018-09-17 22:07:00 +00:00
|
|
|
sentry.extra_context({
|
|
|
|
"item": repr(item)
|
|
|
|
})
|
|
|
|
sentry.captureException()
|
|
|
|
continue
|
|
|
|
if change:
|
2018-12-18 16:34:34 +00:00
|
|
|
change_callback(item, change)
|
2018-09-17 22:07:00 +00:00
|
|
|
sleep_time = delay - time.clock() + t
|
|
|
|
time.sleep(sleep_time if sleep_time > 0 else 0)
|
|
|
|
|
|
|
|
|
2019-01-02 20:10:54 +00:00
|
|
|
# noinspection PyUnusedLocal
|
2018-12-18 16:34:34 +00:00
|
|
|
def new_dota_rank(item: db.Dota, change):
|
2018-09-17 22:07:00 +00:00
|
|
|
try:
|
|
|
|
telegram_bot.send_message(config["Telegram"]["main_group"],
|
|
|
|
f"✳️ {item.steam.royal.username} è salito a"
|
|
|
|
f" {item.get_rank_name()} {item.get_rank_number()} su Dota 2!")
|
|
|
|
except Exception:
|
|
|
|
logger.warning(f"Couldn't notify on Telegram: {item}")
|
|
|
|
|
|
|
|
|
2019-01-23 14:00:30 +00:00
|
|
|
def new_lol_rank(item, change: typing.Tuple[Dirty, Dirty, Dirty]):
|
2018-12-18 16:34:34 +00:00
|
|
|
# It always gets called, even when there is no change
|
|
|
|
solo, flex, twtr = change
|
2018-09-17 22:07:00 +00:00
|
|
|
try:
|
2018-12-18 16:34:34 +00:00
|
|
|
if solo:
|
|
|
|
telegram_bot.send_message(config["Telegram"]["main_group"],
|
2019-01-02 20:10:54 +00:00
|
|
|
f"✳️ {item.royal.username} ha un nuovo rank in **SOLO/DUO**"
|
|
|
|
f" su League of Legends!\n"
|
|
|
|
f"{solo.initial_value[0]} {solo.initial_value[1]} ->"
|
|
|
|
f" **{solo.value[0]} {solo.value[1]}**",
|
2018-12-18 16:34:34 +00:00
|
|
|
parse_mode="Markdown")
|
|
|
|
if flex:
|
|
|
|
telegram_bot.send_message(config["Telegram"]["main_group"],
|
2019-01-02 20:10:54 +00:00
|
|
|
f"✳️ {item.royal.username} ha un nuovo rank in **FLEX**"
|
|
|
|
f" su League of Legends!\n"
|
|
|
|
f"{flex.initial_value[0]} {flex.initial_value[1]} ->"
|
|
|
|
f" **{flex.value[0]} {flex.value[1]}**",
|
2018-12-18 16:34:34 +00:00
|
|
|
parse_mode="Markdown")
|
|
|
|
if twtr:
|
|
|
|
telegram_bot.send_message(config["Telegram"]["main_group"],
|
2019-01-02 20:10:54 +00:00
|
|
|
f"✳️ {item.royal.username} ha un nuovo rank in **3V3**"
|
|
|
|
f" su League of Legends!\n"
|
|
|
|
f"{twtr.initial_value[0]} {twtr.initial_value[1]} ->"
|
|
|
|
f" **{twtr.value[0]} {twtr.value[1]}**",
|
2018-12-18 16:34:34 +00:00
|
|
|
parse_mode="Markdown")
|
2018-09-17 22:07:00 +00:00
|
|
|
except Exception:
|
|
|
|
logger.warning(f"Couldn't notify on Telegram: {item}")
|
2019-01-23 14:00:30 +00:00
|
|
|
|
|
|
|
|
|
|
|
def osu_pp_change(item, change: typing.Tuple[DirtyDelta, DirtyDelta, DirtyDelta, DirtyDelta]):
|
|
|
|
std, taiko, catch, mania = change
|
|
|
|
try:
|
|
|
|
if std.delta >= 1:
|
|
|
|
telegram_bot.send_message(config["Telegram"]["main_group"],
|
2019-01-23 14:10:31 +00:00
|
|
|
f"✳️ {item.royal.username} ha ora **{std.value}pp** (+{std.delta}) su osu!",
|
2019-01-23 14:00:30 +00:00
|
|
|
parse_mode="Markdown")
|
|
|
|
if taiko.delta >= 1:
|
|
|
|
telegram_bot.send_message(config["Telegram"]["main_group"],
|
2019-01-23 14:10:31 +00:00
|
|
|
f"✳️ {item.royal.username} ha ora **{taiko.value}pp** (+{taiko.delta}) su osu!taiko!",
|
2019-01-23 14:00:30 +00:00
|
|
|
parse_mode="Markdown")
|
|
|
|
if catch.delta >= 1:
|
|
|
|
telegram_bot.send_message(config["Telegram"]["main_group"],
|
2019-01-23 14:10:31 +00:00
|
|
|
f"✳️ {item.royal.username} ha ora **{catch.value}pp** (+{catch.delta}) su osu!catch!",
|
2019-01-23 14:00:30 +00:00
|
|
|
parse_mode="Markdown")
|
|
|
|
if mania.delta >= 1:
|
|
|
|
telegram_bot.send_message(config["Telegram"]["main_group"],
|
2019-01-23 14:10:31 +00:00
|
|
|
f"✳️ {item.royal.username} ha ora **{mania.value}pp** (+{mania.delta}) su osu!mania!",
|
2019-01-23 14:00:30 +00:00
|
|
|
parse_mode="Markdown")
|
|
|
|
except Exception:
|
|
|
|
logger.warning(f"Couldn't notify on Telegram: {item}")
|
2018-09-17 22:07:00 +00:00
|
|
|
|
|
|
|
|
|
|
|
def process():
|
|
|
|
while True:
|
|
|
|
session = db.Session()
|
2019-01-23 14:09:27 +00:00
|
|
|
logger.info("Now updating osu! data.")
|
|
|
|
update_block(session, session.query(db.Osu).all(), delay=5, change_callback=osu_pp_change)
|
|
|
|
session.commit()
|
2018-09-17 22:11:28 +00:00
|
|
|
logger.info("Now updating Steam data.")
|
2018-10-07 22:42:45 +00:00
|
|
|
update_block(session, session.query(db.Steam).all())
|
2018-09-17 22:11:28 +00:00
|
|
|
session.commit()
|
|
|
|
logger.info("Now updating Dota data.")
|
2018-10-07 22:42:45 +00:00
|
|
|
update_block(session, session.query(db.Dota).all(), delay=5, change_callback=new_dota_rank)
|
2018-09-17 22:11:28 +00:00
|
|
|
session.commit()
|
|
|
|
logger.info("Now updating League of Legends data.")
|
2018-10-07 22:42:45 +00:00
|
|
|
update_block(session, session.query(db.LeagueOfLegends).all(), delay=5, change_callback=new_lol_rank)
|
2018-09-17 22:11:28 +00:00
|
|
|
session.commit()
|
2018-09-17 22:07:00 +00:00
|
|
|
logger.info("Now updating Overwatch data.")
|
2018-10-07 22:42:45 +00:00
|
|
|
update_block(session, session.query(db.Overwatch).all(), delay=5)
|
2018-09-17 22:07:00 +00:00
|
|
|
session.commit()
|
2018-12-18 18:34:34 +00:00
|
|
|
logger.info("Pausing for 30 minutes.")
|
|
|
|
time.sleep(1800)
|
2018-09-17 22:07:00 +00:00
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
process()
|