From 8e317b0fa5e803f8137d13297e3812a8159d74e0 Mon Sep 17 00:00:00 2001
From: Pavel Kirilin <win10@list.ru>
Date: Sun, 19 Jan 2020 18:02:43 +0400
Subject: [PATCH] Update notifications. Description: - Added update
 notification logic. - Bumped up version.

Signed-off-by: Pavel Kirilin <win10@list.ru>
---
 src/actions/__init__.py        | 15 +++++++++++++++
 src/models/crud/server_crud.py |  9 +++++++++
 2 files changed, 24 insertions(+)

diff --git a/src/actions/__init__.py b/src/actions/__init__.py
index a54b676..3827707 100644
--- a/src/actions/__init__.py
+++ b/src/actions/__init__.py
@@ -3,7 +3,22 @@ from .interactive_session import *
 from .permissions import *
 from .server_management import *
 from .stats import *
+from ..models.crud.server_crud import fn_get_all_chat_ids
+
+
+async def notify_about_updates():
+    with open('app.info') as f:
+        app_info = f.read()
+    for chat_id in await fn_get_all_chat_ids(settings.engine):
+        await settings.dispatcher.bot.send_message(chat_id,
+                                                   '* Admin bot was recently updated. *\n'
+                                                   '* Release info: *\n'
+                                                   f'version: `{bot_version}`\n'
+                                                   f'{app_info}',
+                                                   parse_mode=ParseMode.MARKDOWN)
 
 
 async def start_bot():
+    if settings.app_mode == 'prod':
+        await notify_about_updates()
     await settings.dispatcher.start_polling()
diff --git a/src/models/crud/server_crud.py b/src/models/crud/server_crud.py
index 3a3be49..52ce8f7 100644
--- a/src/models/crud/server_crud.py
+++ b/src/models/crud/server_crud.py
@@ -2,6 +2,7 @@ import logging
 from typing import Optional, List
 
 from aiopg.sa import Engine
+from sqlalchemy import select
 
 from src.models import Server
 from src.models.server import ServerPermissions
@@ -73,3 +74,11 @@ async def fn_delete_server(engine: Engine, *,
                     .where(Server.server_alias == server_alias))
     async with engine.acquire() as db_connection:
         await db_connection.execute(delete_query)
+
+
+async def fn_get_all_chat_ids(engine: Engine) -> List[int]:
+    chat_select = select([Server.chat_id]).group_by(Server.chat_id).distinct()
+    async with engine.acquire() as connection:
+        cursor = await connection.execute(chat_select)
+        servers = await cursor.fetchall()
+    return list(map(lambda x: int(x.chat_id), servers))
-- 
GitLab