summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitrii Morozov <snoopdesigns@gmail.com>2024-05-06 18:27:03 +0200
committerDmitrii Morozov <snoopdesigns@gmail.com>2024-05-06 18:27:03 +0200
commit8e996d9094814b74195c49d4c8aa2d1ebb37e206 (patch)
tree53851f09410cf265f1a52edededbd30cb287bcd7
parentbefee096bcdd48630741fb650ecb5e89d4d6ef3d (diff)
Save last user presence in database
-rw-r--r--persistence.py37
-rw-r--r--requirements.txt38
-rwxr-xr-xtgbot.py26
3 files changed, 88 insertions, 13 deletions
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()