Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -178,13 +178,29 @@ async def _stats(self, update: Update, context: CallbackContext):
return

activity_summary_text = []
activity_summary_text.append('*Activity summary*')

# Query activity summary for each interval
activity_summary_text.append('*Activity*')
for interval in VALID_SUMMARY_INTERVALS:
activity_summary = self._db.get_activity_summary(interval)
activity_summary_text.append(f"_{interval.lower()}_")
for activity in activity_summary:
activity_summary_text.append(f"- {activity}")
activity_summary_text.append('')

# Query subscription summary
activity_summary_text.append('*Subscriptions*')
subscription_summary = self._db.get_subscription_summary()
for station in subscription_summary:
activity_summary_text.append(f"- {station}")

# Query unique subscribers
unique_subscribers = self._db.count_unique_subscribers()
activity_summary_text.append('')
activity_summary_text.append(
f"_Unique subscribers: {unique_subscribers}_")
activity_summary_text.append('')

activity_summary_text = "\n".join(activity_summary_text)
await update.message.reply_markdown(activity_summary_text)

Expand Down
45 changes: 17 additions & 28 deletions db.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,34 +23,6 @@ def _get_db_connection(self):
cursor_factory=DictCursor)
return connection

def _create_tables(self):
connection = self._get_db_connection()
try:
with connection.cursor() as cursor:
cursor.execute(f"""
CREATE TABLE IF NOT EXISTS activity_{self._table_suffix} (
id SERIAL PRIMARY KEY,
activity_type VARCHAR(50) NOT NULL,
user_id VARCHAR(50) NOT NULL,
station TEXT,
timestamp TIMESTAMP NOT NULL
)
""")

# subscriptions table
cursor.execute(f"""
CREATE TABLE IF NOT EXISTS subscriptions_{self._table_suffix} (
id SERIAL PRIMARY KEY,
station TEXT NOT NULL,
user_id VARCHAR(50) NOT NULL
)
""")
connection.commit()
except Exception as e:
logger.error(f"{e} while creating tables")
finally:
connection.close()

def _create_tables(self):
connection = self._get_db_connection()
try:
Expand Down Expand Up @@ -129,6 +101,23 @@ def get_subscriptions_by_station(self, station) -> list[int]:
else:
return []

def count_unique_subscribers(self) -> list[int]:
sql = f"""
SELECT DISTINCT user_id
FROM subscriptions_{self._table_suffix}
"""
subscribers = self._select(sql)
return len([subscriber['user_id'] for subscriber in subscribers])

def get_subscription_summary(self) -> list[str]:
stations = self.stations_with_subscribers()
summary = []
for station in stations:
summary.append(
f"{station}: {len(self.get_subscriptions_by_station(station))}"
)
return summary

def _select_with_values(self, sql, values):
connection = self._get_db_connection()
try:
Expand Down
11 changes: 4 additions & 7 deletions ecmwf.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,13 +122,10 @@ def _get_with_request(self, link, raise_on_error=True):
if not result.ok and raise_on_error:
raise ValueError('Request failed for {}'.format(get))
else:
if result.status_code == 403:
raise ValueError('403 Forbidden for {}'.format(get))
else:
try:
return result.json()
except json.decoder.JSONDecodeError:
raise ValueError('JSONDecodeError for {}'.format(get))
try:
return result.json()
except json.decoder.JSONDecodeError:
raise ValueError('JSONDecodeError for {}'.format(get))

def _get_API_data_for_epsgram(self,
station,
Expand Down
22 changes: 22 additions & 0 deletions test/test_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,3 +107,25 @@ def test_get_subscriptions_by_station(db_instance):
# Test for a station with no subscriptions
users = db_instance.get_subscriptions_by_station("station3")
assert users == []


def test_subscription_summary(db_instance):
# Add test data
db_instance.add_subscription("station1", 12345)
db_instance.add_subscription("station2", 67890)
db_instance.add_subscription("station1", 54321)

summary = db_instance.get_subscription_summary()

assert summary == ["station1: 2", "station2: 1"]


def test_get_unique_subscribers(db_instance):
# Add test data
db_instance.add_subscription("station1", 12345)
db_instance.add_subscription("station2", 67890)
db_instance.add_subscription("station1", 54321)

unique_subscribers = db_instance.count_unique_subscribers()

assert unique_subscribers == 3
Loading