2020-07-09 22:24:23 +00:00
|
|
|
import logging.config
|
|
|
|
from src.config import settings
|
2020-07-09 23:58:25 +00:00
|
|
|
import sqlite3
|
2020-07-11 15:54:08 +00:00
|
|
|
from src.wiki import Wiki, process_event, process_mwmsgs
|
2020-07-10 13:38:36 +00:00
|
|
|
import asyncio, aiohttp
|
2020-07-10 20:07:33 +00:00
|
|
|
from src.exceptions import *
|
|
|
|
from src.database import db_cursor
|
2020-07-09 22:24:23 +00:00
|
|
|
|
|
|
|
logging.config.dictConfig(settings["logging"])
|
|
|
|
logger = logging.getLogger("rcgcdb.bot")
|
|
|
|
logger.debug("Current settings: {settings}".format(settings=settings))
|
|
|
|
|
2020-07-10 13:38:36 +00:00
|
|
|
# Log Fail states with structure wiki_id: number of fail states
|
2020-07-11 15:54:08 +00:00
|
|
|
all_wikis: dict = {}
|
|
|
|
mw_msgs: dict = {} # will have the type of id: tuple
|
2020-07-09 22:24:23 +00:00
|
|
|
|
2020-07-10 13:38:36 +00:00
|
|
|
# First populate the all_wikis list with every wiki
|
|
|
|
# Reasons for this: 1. we require amount of wikis to calculate the cooldown between requests
|
|
|
|
# 2. Easier to code
|
2020-07-09 22:24:23 +00:00
|
|
|
|
2020-07-10 20:07:33 +00:00
|
|
|
for wiki in db_cursor.execute('SELECT ROWID, * FROM wikis'):
|
2020-07-10 13:38:36 +00:00
|
|
|
all_wikis[wiki[0]] = Wiki()
|
2020-07-09 22:24:23 +00:00
|
|
|
|
|
|
|
# Start queueing logic
|
|
|
|
|
2020-07-11 15:54:08 +00:00
|
|
|
def calculate_delay() -> float:
|
|
|
|
min_delay = 60/settings["max_requests_per_minute"]
|
|
|
|
if (len(all_wikis) * min_delay) < settings["minimal_cooldown_per_wiki_in_sec"]:
|
|
|
|
return settings["minimal_cooldown_per_wiki_in_sec"]/len(all_wikis)
|
|
|
|
else:
|
|
|
|
return min_delay
|
|
|
|
|
2020-07-10 13:38:36 +00:00
|
|
|
async def main_loop():
|
2020-07-11 15:54:08 +00:00
|
|
|
calc_delay = calculate_delay()
|
|
|
|
|
2020-07-10 20:07:33 +00:00
|
|
|
for db_wiki in db_cursor.execute('SELECT ROWID, * FROM wikis'):
|
2020-07-10 13:38:36 +00:00
|
|
|
extended = False
|
|
|
|
if wiki[0] not in all_wikis:
|
|
|
|
logger.debug("New wiki: {}".format(wiki[1]))
|
|
|
|
all_wikis[wiki[0]] = Wiki()
|
|
|
|
local_wiki = all_wikis[wiki[0]] # set a reference to a wiki object from memory
|
2020-07-10 20:07:33 +00:00
|
|
|
if local_wiki.mw_messages is None:
|
2020-07-10 13:38:36 +00:00
|
|
|
extended = True
|
2020-07-10 14:11:45 +00:00
|
|
|
try:
|
2020-07-10 20:07:33 +00:00
|
|
|
wiki_response = await local_wiki.fetch_wiki(extended, db_wiki[3], db_wiki[4])
|
2020-07-10 14:11:45 +00:00
|
|
|
await local_wiki.check_status(wiki[0], wiki_response.status, db_wiki[1])
|
2020-07-10 20:07:33 +00:00
|
|
|
except (WikiServerError, WikiError):
|
|
|
|
continue # ignore this wikis if it throws errors
|
2020-07-11 15:54:08 +00:00
|
|
|
try:
|
|
|
|
recent_changes_resp = await wiki_response.json(encoding="UTF-8")
|
|
|
|
recent_changes = recent_changes_resp['query']['recentchanges'].reverse()
|
|
|
|
except:
|
|
|
|
logger.exception("On loading json of response.")
|
|
|
|
continue
|
|
|
|
if extended:
|
|
|
|
await process_mwmsgs(recent_changes_resp, local_wiki, mw_msgs)
|
|
|
|
for change in recent_changes:
|
|
|
|
if change["rcid"] < db_wiki[6]:
|
|
|
|
await process_event(change, local_wiki)
|
|
|
|
await asyncio.sleep(delay=calc_delay)
|