!debug update

This commit is contained in:
dan63047 2020-06-09 13:19:10 +03:00
parent 738337b673
commit 31bd60f814
3 changed files with 60 additions and 9 deletions

View File

@ -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. Введите ещё раз, чтобы выключить режим модерации. Доступно только вам

View File

@ -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,8 +98,20 @@ 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:
cur = self._CON.cursor()
@ -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"<br> @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"<br>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 + "<br>Прослушано сообщений: " + str(
debug_array['messages_get']) + " (Отправлено " + str(
debug_array['messages_answered']) + ")<br>Ошибок в работе: " + str(
debug_array['logger_warnings']) + " (Из них беды с ВК: " + str(debug_array['vk_warnings']) + ")<br>Обьектов бота: " + str(len(bot)) + "<br>Запуск бота по часам сервера: " + datetime_time.strftime('%d.%m.%Y %H:%M:%S UTC')
debug_array['messages_get']) + "<br>Отправлено сообщений:" + str(
debug_array['messages_answered']) + "<br>Ошибок в работе: " + str(
debug_array['logger_warnings']) + ", из них:<br> •Беды с ВК: " + str(
debug_array['vk_warnings']) + "<br> •Беды с БД: " + str(
debug_array['db_warnings']) + "<br> •Беды с ботом: " + str(
debug_array['bot_warnings']) + "<br>Обьектов бота: " + str(
len(bot)) + "<br>Запуск бота по часам сервера: " + 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():

View File

@ -29,5 +29,5 @@
!h, !help - справка
Дата последнего обновления: 07.05.2020 (Данные бота теперь хранятся в базе данных)
Дата последнего обновления: 09.06.2020 (!debug update)
Проект бота на GitHub: https://github.com/dan63047/dan63047pythonbot