diff --git a/README.md b/README.md index 59eb315..ba3ef57 100644 --- a/README.md +++ b/README.md @@ -14,13 +14,15 @@ * **!wiki *запрос*** — бот получает с помощью Wikipedia API краткое описание статьи по запросу и отправляет её вам * **!byn** — бот получает с помощью НБ РБ API текущий курс белорусского рубля и отправляет её вам * **!echo** — бот начинает повторять за вами, чтобы это остановить, надо написать *!echo off* -* **!game *камень/ножницы/бумага/статистика*** — бот играет с вами в "Камень, ножницы, бумага" и ведет статискику игр, которую записывает в файл json +* **!game *камень/ножницы/бумага/статистика*** — бот играет с вами в "Камень, ножницы, бумага" и ведет статискику игр, которую записывает в файл БД * **!midnight** — бот будет уведомлять о каждом миднайте по Московскому времени. Введите ещё раз, чтобы отменить это * **!reminder *set/list/delete*** — напоминалка. С агрументом *set* бот запускает установку напоминания, с аргументом *list* отправляет вам все ваши запланированные напоминания, с аргументом *delete* запускает удаление напоминания * **!subscribe** — бот будет уведомлять вас о каждом новом посте. Введите ещё раз, чтобы отменить это * **!debug** — бот отправляет информацию о своём состоянии * **!debug *log*** — бот отправляет последние 10 строк из своего лога. Доступно только вам * **!debug *bots*** — бот отправляет информацию о обьектах бота в памяти. Доступно только вам +* **!debug *game*** — бот отправляет всю статистику по игре !game +* **!debug *tasks*** — бот отправляет вам все напоминания из !reminder. Доступно только вам * **!access *all/owner*** — позволяет в беседе установить уровень доступа к командам *!midnight*, *!subscribe* и *!debug*. *all* - все могут пользоваться. *owner* - только вы. Доступно только вам * **!turnoff** — даёт боту команду на выключение. Доступно только вам * **!admin_mode** — если чат, в которой активируется команда, является беседой и в ней у бота есть полномочия администратора, то бот переходит в режим модерации. Пока что он может только кикать людей за @all и @online. Введите ещё раз, чтобы выключить режим модерации. Доступно только вам diff --git a/dan63047bot.py b/dan63047bot.py index 175f2da..2ee0378 100644 --- a/dan63047bot.py +++ b/dan63047bot.py @@ -37,7 +37,7 @@ def log(warning, text): log(False, "Script started") bot = {} -debug_array = {'vk_warnings': 0, 'logger_warnings': 0, 'start_time': 0, 'messages_get': 0, 'messages_answered': 0} +debug_array = {'vk_warnings': 0, 'db_warnings': 0, 'bot_warnings': 0, 'logger_warnings': 0, 'start_time': 0, 'messages_get': 0, 'messages_answered': 0} errors_array = {"access": "Отказано в доступе", "miss_argument": "Отсуствует аргумент"} longpoll = VkBotLongPoll(vk, group_id) @@ -66,6 +66,7 @@ class MySQL_worker(): cur.close() log(False, f"Database connection established") except Exception as e: + debug_array['db_warnings'] += 1 log(True, f"Unable to connect to database: {str(e)}") def set_new_user(self, peer_id, midnight=False, awaiting=None, access=1, new_post=False, admin_mode=False, game_wins=0, game_defeats=0, game_draws=0): @@ -75,6 +76,7 @@ class MySQL_worker(): self._CON.commit() cur.close() except Exception as e: + debug_array['db_warnings'] += 1 log(True, f"Unable to add new user in database: {str(e)}") def get_all_users(self): @@ -85,6 +87,7 @@ class MySQL_worker(): cur.close() return result except Exception as e: + debug_array['db_warnings'] += 1 log(True, f"Unable to load user from database: {str(e)}") def get_from_users(self, from_id): @@ -95,7 +98,19 @@ class MySQL_worker(): cur.close() return result except Exception as e: + debug_array['db_warnings'] += 1 log(True, f"Unable to load user from database: {str(e)}") + + def get_game_stat(self): + try: + cur = self._CON.cursor() + cur.execute("SELECT chat_id, game_wins, game_draws, game_defeats FROM bot_users WHERE game_wins > 0 OR game_draws > 0 OR game_defeats > 0") + result = cur.fetchall() + cur.close() + return result + except Exception as e: + debug_array['db_warnings'] += 1 + log(True, f"Unable to load stats from database: {str(e)}") def update_user(self, chat_id, thing, new_value): try: @@ -104,16 +119,18 @@ class MySQL_worker(): self._CON.commit() cur.close() except Exception as e: + debug_array['db_warnings'] += 1 log(True, f"Unable to update info about user in database: {str(e)}") def delete_user(self, chat_id): try: cur = self._CON.cursor() - cur.execute("DELETE FROM bot_users WHERE chat_id = %s", (chat_id)) + cur.execute("DELETE FROM bot_users, game_defeats WHERE chat_id = %s", (chat_id)) self._CON.commit() cur.close() return True except Exception as e: + debug_array['db_warnings'] += 1 log(True, f"Unable to delete user from database: {str(e)}") return False @@ -125,6 +142,7 @@ class MySQL_worker(): cur.close() return result except Exception as e: + debug_array['db_warnings'] += 1 log(True, f"Unable to load tasks from database: {str(e)}") def set_new_task(self, chat_id, time, task): @@ -134,6 +152,7 @@ class MySQL_worker(): self._CON.commit() cur.close() except Exception as e: + debug_array['db_warnings'] += 1 log(True, f"Unable to add new task in database: {str(e)}") def get_from_tasks(self, from_id): @@ -144,6 +163,7 @@ class MySQL_worker(): cur.close() return result except Exception as e: + debug_array['db_warnings'] += 1 log(True, f"Unable to load tasks from database: {str(e)}") def delete_task(self, from_id, task): @@ -154,6 +174,7 @@ class MySQL_worker(): cur.close() return True except Exception as e: + debug_array['db_warnings'] += 1 log(True, f"Unable to delete task from database: {str(e)}") return False @@ -166,6 +187,7 @@ def load_users(): for i in get_info: bot[int(i['chat_id'])] = VkBot(i['chat_id'], i['midnight'], i['awaiting'], int(i['access']), i['new_post'], i['admin_mode']) except Exception as lol: + debug_array['bot_warnings'] += 1 log(True, f"Problem with creating objects: {str(lol)}") @@ -468,6 +490,29 @@ class VkBot: return answer else: return errors_array["access"] + elif arg == "game": + stats = db.get_game_stat() + if len(stats) > 0: + answer = "Статистика игроков в !game" + for i in stats: + try: + winrate = (i['game_wins']/(i['game_wins']+i['game_defeats']+i['game_draws'])) * 100 + except ZeroDivisionError: + winrate = 0 + answer += f"
@id{i['chat_id']} - Сыграл раз: {i['game_wins']+i['game_defeats']+i['game_draws']}, Победы/Ничьи/Поражения: {i['game_wins']}/{i['game_defeats']}/{i['game_draws']}, {toFixed(winrate, 2)}% побед" + else: + answer = "Никто не пользуется !game" + return answer + elif arg == "tasks": + if self._OWNER: + tasks = db.get_all_tasks() + if len(tasks) > 0: + answer = "Напоминания в !reminder" + for i in tasks: + answer += f"
id{i['chat_id']} - {i['time']}: {i['task']}" + else: + answer = "Никто не пользуется !reminder" + return answer else: up_time = time.time() - debug_array['start_time'] time_d = int(up_time) / (3600 * 24) @@ -477,9 +522,13 @@ class VkBot: str_up_time = '%01d:%02d:%02d:%02d' % (time_d, time_h, time_min, time_sec) datetime_time = datetime.datetime.fromtimestamp(debug_array['start_time']) answer = "UPTIME: " + str_up_time + "
Прослушано сообщений: " + str( - debug_array['messages_get']) + " (Отправлено " + str( - debug_array['messages_answered']) + ")
Ошибок в работе: " + str( - debug_array['logger_warnings']) + " (Из них беды с ВК: " + str(debug_array['vk_warnings']) + ")
Обьектов бота: " + str(len(bot)) + "
Запуск бота по часам сервера: " + datetime_time.strftime('%d.%m.%Y %H:%M:%S UTC') + debug_array['messages_get']) + "
Отправлено сообщений:" + str( + debug_array['messages_answered']) + "
Ошибок в работе: " + str( + debug_array['logger_warnings']) + ", из них:
•Беды с ВК: " + str( + debug_array['vk_warnings']) + "
•Беды с БД: " + str( + debug_array['db_warnings']) + "
•Беды с ботом: " + str( + debug_array['bot_warnings']) + "
Обьектов бота: " + str( + len(bot)) + "
Запуск бота по часам сервера: " + datetime_time.strftime('%d.%m.%Y %H:%M:%S UTC') return answer def reminder(self, string, stage): @@ -742,8 +791,8 @@ def bots(): else: log(False, f"Event {str(event.type)} happend") except Exception as kek: - err = "Беды с ботом: " + str(kek) - log(True, err) + log(True, f"Беды с ботом: {str(kek)}") + debug_array['bot_warnings'] += 1 continue def midnight(): diff --git a/help.txt b/help.txt index eb89222..bcb02a9 100644 --- a/help.txt +++ b/help.txt @@ -29,5 +29,5 @@ !h, !help - справка -Дата последнего обновления: 07.05.2020 (Данные бота теперь хранятся в базе данных) +Дата последнего обновления: 09.06.2020 (!debug update) Проект бота на GitHub: https://github.com/dan63047/dan63047pythonbot