From 8e996d9094814b74195c49d4c8aa2d1ebb37e206 Mon Sep 17 00:00:00 2001 From: Dmitrii Morozov Date: Mon, 6 May 2024 18:27:03 +0200 Subject: Save last user presence in database --- persistence.py | 37 ++++++++++++++++++++++++++++++++++++- requirements.txt | 38 ++++++++++++++++++++++++++++++++++++++ tgbot.py | 26 ++++++++++++++------------ 3 files changed, 88 insertions(+), 13 deletions(-) create mode 100644 requirements.txt diff --git a/persistence.py b/persistence.py index 92452ce..8003a41 100644 --- a/persistence.py +++ b/persistence.py @@ -91,4 +91,39 @@ class StatsRepository: userStats.matches_played = int(record[3]) userStats.kills = int(record[4]) userStats.wins = int(record[5]) - return userStats \ No newline at end of file + return userStats + +class PresenceRepository: + + def __init__(self): + self.__initialize() + + def __getConnection(self): + return sqlite3.connect('db.sqlite') + + def __initialize(self): + cur = self.__getConnection().cursor() + cur.execute("CREATE TABLE IF NOT EXISTS user_presence(display_name TEXT, last_online INT)") + cur.execute("CREATE UNIQUE INDEX IF NOT EXISTS display_name_idx ON user_presence(display_name)") + + def getLastUserPresence(self, display_name): + connection = self.__getConnection() + cur = connection.cursor() + query = "select last_online from user_presence where display_name = '{display_name}'s".format(display_name = display_name) + cur.execute(query) + user_presence = cur.fetchone() + + if user_presence: + return user_presence[0] + else: + return 0 + + def setLastUserPresence(self, display_name: str, last_online: int): + connection = self.__getConnection() + cur = connection.cursor() + query = "INSERT OR REPLACE INTO user_presence(display_name, last_online) VALUES('{display_name}', {last_online})".format( + display_name = display_name, + last_online = last_online) + cur.execute(query) + connection.commit() + \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..f07afbe --- /dev/null +++ b/requirements.txt @@ -0,0 +1,38 @@ +aioconsole==0.7.1 +aiohttp==3.9.5 +aioopenssl==0.6.0 +aiosasl==0.5.0 +aiosignal==1.3.1 +aioxmpp==0.13.3 +attrs==23.2.0 +Babel==2.15.0 +beautifulsoup4==4.12.3 +bs4==0.0.2 +certifi==2024.2.2 +cffi==1.16.0 +charset-normalizer==3.3.2 +cryptography==42.0.6 +dnspython==2.6.1 +fortnitepy==3.6.9 +frozenlist==1.4.1 +html5lib==1.1 +idna==3.7 +lxml==4.9.4 +multidict==6.0.5 +nest-asyncio==1.6.0 +pyasn1==0.6.0 +pyasn1_modules==0.4.0 +pycparser==2.22 +pyOpenSSL==24.1.0 +pyTelegramBotAPI==4.17.0 +pytz==2024.1 +requests==2.31.0 +six==1.16.0 +sortedcollections==2.1.0 +sortedcontainers==2.4.0 +soupsieve==2.5 +telebot==0.0.5 +tzlocal==5.2 +urllib3==2.2.1 +webencodings==0.5.1 +yarl==1.9.4 diff --git a/tgbot.py b/tgbot.py index 87d93e1..63ff179 100755 --- a/tgbot.py +++ b/tgbot.py @@ -5,7 +5,7 @@ from FortniteStatusNotifier import * from Formatter import * from FortniteClient import * from FortniteEvents import * -from persistence import UserRepository, StatsRepository +from persistence import UserRepository, StatsRepository, PresenceRepository # Check token in environment variables if "TELEBOT_BOT_TOKEN" not in os.environ: @@ -26,20 +26,13 @@ class FortniteStatusObserver(Observer): await send_message_to_all(formatFortniteStatus(fortniteStatus)) class FortnitePresenceObserver(PresenceObserver): - # Map name -> last seen not playing timestamp seconds - statuses = {} - async def update(self, display_name: str, playing: bool, party_size: int) -> None: if playing: - if not display_name in self.statuses: + last_presence = prensenceRepository.getLastUserPresence(display_name) + diff = time.time() - last_presence + if diff > 60 * 60: # 60 minutes await self.__notifyFriendPlaying(display_name, party_size) - self.statuses[display_name] = time.time() - else: - diff = time.time() - self.statuses[display_name] - if diff > 60 * 60: # 60 minutes - await self.__notifyFriendPlaying(display_name, party_size) - else: - self.statuses[display_name] = time.time() + prensenceRepository.setLastUserPresence(display_name, time.time()) async def __notifyFriendPlaying(self, display_name: str, party_size: int): await send_message_to_all(formatFriendOnline(display_name, party_size)) @@ -55,6 +48,7 @@ bot = telebot.async_telebot.AsyncTeleBot( exception_handler=ExceptionHandler()) userRepository = UserRepository() statsRepository = StatsRepository() +prensenceRepository = PresenceRepository() fortniteStatusWrapper = FortniteStatusNotifier(FortniteStatusObserver()) fortniteClient = FortniteClient(FortnitePresenceObserver(), ClientInitObserver()) @@ -93,6 +87,14 @@ async def getTodayStats(message): async def recordStats(message): await record_user_stats() +@bot.message_handler(commands = ['online']) +async def mockOnline(message): + await FortnitePresenceObserver().update('snoopdesigns', True, 1) + +@bot.message_handler(commands = ['offline']) +async def mockOffline(message): + await FortnitePresenceObserver().update('snoopdesigns', False, 1) + @bot.message_handler(commands = ['find']) async def findUser(message): arg = message.text.split() -- cgit v1.2.3