!midnight (i hope it will work)

This commit is contained in:
dan63047 2020-05-08 22:30:43 +03:00
parent 7a7a9d2ecc
commit 81359ec843
1 changed files with 137 additions and 101 deletions

View File

@ -6,15 +6,14 @@ import logging
import pyowm import pyowm
import random import random
import json import json
import asyncio import threading
import os
import wikipediaapi as wiki import wikipediaapi as wiki
from collections import deque from collections import deque
from config import vk, owm, vk_mda, group_id, album_for_command, owner_id from config import vk, owm, vk_mda, group_id, album_for_command, owner_id
from vk_api.longpoll import VkLongPoll, VkEventType
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType
bot = {} bot = {}
users = []
debug_array = {'vk_warnings': 0, 'logger_warnings': 0, 'start_time': 0, 'messages_get': 0, 'messages_answered': 0} debug_array = {'vk_warnings': 0, 'logger_warnings': 0, 'start_time': 0, 'messages_get': 0, 'messages_answered': 0}
root_logger = logging.getLogger() root_logger = logging.getLogger()
@ -75,6 +74,7 @@ class VkBot:
log(False, f"Создан объект бота! id{peer_id}") log(False, f"Создан объект бота! id{peer_id}")
self._USER_ID = user_id self._USER_ID = user_id
self._CHAT_ID = peer_id self._CHAT_ID = peer_id
self._MIDNIGHT_EVENT = False
self._ECHO_MODE = False self._ECHO_MODE = False
if self._USER_ID == owner_id and self._CHAT_ID <= 2000000000: if self._USER_ID == owner_id and self._CHAT_ID <= 2000000000:
@ -83,22 +83,112 @@ class VkBot:
self._OWNER = False self._OWNER = False
self._COMMANDS = ["!image", "!my_id", "!h", "!user_id", "!group_id", "!help", "!weather", "!wiki", "!byn", self._COMMANDS = ["!image", "!my_id", "!h", "!user_id", "!group_id", "!help", "!weather", "!wiki", "!byn",
"!echo", "!game", "!debug"] "!echo", "!game", "!debug", "!midnight"]
async def get_message(self, message): def event(self, event):
if event == "midnight" and self._MIDNIGHT_EVENT:
self.send("Миднайт")
log(False, f"Бот id{self._CHAT_ID} оповестил о миднайте")
def get_message(self, message):
if self._ECHO_MODE: if self._ECHO_MODE:
if message == "!echo off": if message == "!echo off":
vk.method('messages.send', self.send(message)
{'peer_id': self._CHAT_ID, 'message': "Режим эхо выключен", 'random_id': time.time()})
self._ECHO_MODE = False self._ECHO_MODE = False
log(False, f"Бот id{self._CHAT_ID} вышел из режима эхо") log(False, f"Бот id{self._CHAT_ID} вышел из режима эхо")
debug_array['messages_answered'] += 1
else: else:
vk.method('messages.send', {'peer_id': self._CHAT_ID, 'message': message, 'random_id': time.time()}) self.send(message)
log(False, f"Эхо-бот id{self._CHAT_ID}: {message}") log(False, f"Эхо-бот id{self._CHAT_ID}: {message}")
debug_array['messages_answered'] += 1
else: else:
await self.send_message(message) respond = {'attachment': None, 'text': None}
message = message.split(' ', 1)
if message[0] == self._COMMANDS[0]:
respond['attachment'] = self.random_image()
def debug(self): elif message[0] == self._COMMANDS[1]:
respond['text'] = "Ваш ид: " + str(self._USER_ID)
elif message[0] == self._COMMANDS[2] or message[0] == self._COMMANDS[5]:
respond[
'text'] = "Я бот, призванный доставлять неудобства. <br>Команды:<br>!my_id - сообщит ваш id в ВК<br>!user_id *id* - сообщит информацию о этом пользователе<br>!group_id *id* - сообщит информацию о этой группе<br>!image - отправляет рандомную картинку из альбома<br>!weather *город* - отправляет текущую погоду в городе (данные из OpenWeather API)<br>!wiki *запрос* - отправляет информацию об этом из Wikipedia<br>!byn - отправляет текущий курс валют, полученный из API НБ РБ<br>!echo - бот отправляет вам всё, что вы ему пишите<br>!game *камень/ножницы/бумага/статистика* - бот будет играть с вами в \"Камень, ножницы, бумага\" и записывать статистику<br>!midnight - бот будет уведомлять вас о 00:00 по Москве. Отправьте ещё раз, чтобы бот больше вас не уведомлял<br>!h, !help - справка<br>Дата последнего обновления: 08.05.2020 (!midnight и перестройка бота)<br>Проект бота на GitHub: https://github.com/dan63047/dan63047pythonbot"
elif message[0] == self._COMMANDS[3]:
try:
respond['text'] = self.get_info_user(message[1])
except IndexError:
respond['text'] = "Отсуствует аргумент"
elif message[0] == self._COMMANDS[4]:
try:
respond['text'] = self.get_info_group(message[1])
except IndexError:
respond['text'] = "Отсуствует аргумент"
elif message[0] == self._COMMANDS[6]:
try:
respond['text'] = get_weather(message[1])
except IndexError:
respond['text'] = "Отсуствует аргумент"
elif message[0] == self._COMMANDS[7]:
try:
respond['text'] = self.wiki_article(message[1])
except IndexError:
respond['text'] = "Отсуствует аргумент"
elif message[0] == self._COMMANDS[8]:
respond['text'] = self.exchange_rates()
elif message[0] == self._COMMANDS[9]:
vk.method('messages.send', {'peer_id': self._CHAT_ID,
'message': "Теперь бот работает в режиме эхо. Чтобы"
" это выключить, введить \"!echo off\"",
'random_id': time.time()})
self._ECHO_MODE = True
log(False, f"Бот id{self._CHAT_ID} в режиме эхо")
elif message[0] == self._COMMANDS[10]:
try:
message[1] = message[1].lower()
respond['text'] = self.game(message[1])
except IndexError:
respond['text'] = "Отсуствует аргумент"
elif message[0] == self._COMMANDS[11]:
try:
respond['text'] = self.debug(message[1])
except IndexError:
respond['text'] = self.debug()
elif message[0] == self._COMMANDS[12]:
if self._MIDNIGHT_EVENT:
self._MIDNIGHT_EVENT = False
self.send("Уведомление о миднайте выключено")
log(False, f"Бот id{self._CHAT_ID}: Юзер отписался от ивента \"Миднайт\"")
else:
self._MIDNIGHT_EVENT = True
self.send("Бот будет уведомлять вас о каждом миднайте")
log(False, f"Бот id{self._CHAT_ID}: Юзер подписался на ивент \"Миднайт\"")
if respond['text'] or respond['attachment']:
self.send(respond['text'], respond['attachment'])
debug_array['messages_answered'] += 1
def debug(self, arg=None):
if arg == "log":
if self._OWNER:
with open("bot.log", 'r') as f:
log = list(deque(f, 10))
text_log = "<br>Последние 10 строк из лога:<br>"
for i in range(len(log)):
text_log += log[i]
f.close()
return text_log
else:
return "Отказано в доступе"
else:
up_time = time.time() - debug_array['start_time'] up_time = time.time() - debug_array['start_time']
time_d = int(up_time) / (3600 * 24) time_d = int(up_time) / (3600 * 24)
time_h = int(up_time) / 3600 - int(time_d) * 24 time_h = int(up_time) / 3600 - int(time_d) * 24
@ -109,15 +199,7 @@ class VkBot:
answer = "UPTIME: " + str_up_time + "<br>Прослушано сообщений: " + str( answer = "UPTIME: " + str_up_time + "<br>Прослушано сообщений: " + str(
debug_array['messages_get']) + " (Отвечено на " + str( debug_array['messages_get']) + " (Отвечено на " + str(
debug_array['messages_answered']) + ")<br>Ошибок в работе: " + 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') debug_array['logger_warnings']) + " (Из них беды с ВК: " + str(debug_array['vk_warnings']) + ")<br>Обьектов бота: " + str(len(bot)) + "<br>Запуск бота по часам сервера: " + datetime_time.strftime('%d.%m.%Y %H:%M:%S UTC')
if self._OWNER:
with open("bot.log", 'r') as f:
log = list(deque(f, 10))
text_log = "<br>Последние 10 строк из лога:<br>"
for i in range(len(log)):
text_log += log[i]
f.close()
answer += text_log
return answer return answer
def game(self, thing): def game(self, thing):
@ -275,7 +357,7 @@ class VkBot:
answer = "Такой статьи не существует" answer = "Такой статьи не существует"
return answer return answer
async def exchange_rates(self): def exchange_rates(self):
try: try:
rates_USD = json.loads( rates_USD = json.loads(
requests.get("https://www.nbrb.by/api/exrates/rates/145?periodicity=0", timeout=10).text) requests.get("https://www.nbrb.by/api/exrates/rates/145?periodicity=0", timeout=10).text)
@ -295,89 +377,43 @@ class VkBot:
log(True, err) log(True, err)
return "Невозможно получить данные из НБ РБ: " + str(mda) return "Невозможно получить данные из НБ РБ: " + str(mda)
async def send_message(self, message): def send(self, message=None, attachment=None):
respond = {'attachment': None, 'text': None}
message = message.split(' ', 1)
if message[0] == self._COMMANDS[0]:
respond['attachment'] = self.random_image()
elif message[0] == self._COMMANDS[1]:
respond['text'] = "Ваш ид: " + str(self._USER_ID)
elif message[0] == self._COMMANDS[2] or message[0] == self._COMMANDS[5]:
respond[
'text'] = "Я бот, призванный доставлять неудобства. <br>Команды:<br>!my_id - сообщит ваш id в ВК<br>!user_id *id* - сообщит информацию о этом пользователе<br>!group_id *id* - сообщит информацию о этой группе<br>!image - отправляет рандомную картинку из альбома<br>!weather *город* - отправляет текущую погоду в городе (данные из OpenWeather API)<br>!wiki *запрос* - отправляет информацию об этом из Wikipedia<br>!byn - отправляет текущий курс валют, полученный из API НБ РБ<br>!echo - бот отправляет вам всё, что вы ему пишите<br>!game *камень/ножницы/бумага/статистика* - бот будет играть с вами в \"Камень, ножницы, бумага\" и записывать статистику<br>!h, !help - справка<br>Дата последнего обновления: 06.05.2020 (Обновление дебаг функции)<br>Проект бота на GitHub: https://github.com/dan63047/dan63047pythonbot"
elif message[0] == self._COMMANDS[3]:
try:
respond['text'] = self.get_info_user(message[1])
except IndexError:
respond['text'] = "Отсуствует аргумент"
elif message[0] == self._COMMANDS[4]:
try:
respond['text'] = self.get_info_group(message[1])
except IndexError:
respond['text'] = "Отсуствует аргумент"
elif message[0] == self._COMMANDS[6]:
try:
respond['text'] = get_weather(message[1])
except IndexError:
respond['text'] = "Отсуствует аргумент"
elif message[0] == self._COMMANDS[7]:
try:
respond['text'] = self.wiki_article(message[1])
except IndexError:
respond['text'] = "Отсуствует аргумент"
elif message[0] == self._COMMANDS[8]:
respond['text'] = await self.exchange_rates()
elif message[0] == self._COMMANDS[9]:
vk.method('messages.send', {'peer_id': self._CHAT_ID,
'message': "Теперь бот работает в режиме эхо. Чтобы"
" это выключить, введить \"!echo off\"",
'random_id': time.time()})
self._ECHO_MODE = True
log(False, f"Бот id{self._CHAT_ID} в режиме эхо")
elif message[0] == self._COMMANDS[10]:
try:
message[1] = message[1].lower()
respond['text'] = self.game(message[1])
except IndexError:
respond['text'] = "Отсуствует аргумент"
elif message[0] == self._COMMANDS[11]:
respond['text'] = self.debug()
if respond['text'] or respond['attachment']:
message = vk.method('messages.send', message = vk.method('messages.send',
{'peer_id': self._CHAT_ID, 'message': respond['text'], 'random_id': time.time(), {'peer_id': self._CHAT_ID, 'message': message, 'random_id': time.time(),
'attachment': respond['attachment']}) 'attachment': attachment})
debug_array['messages_answered'] += 1 log(False, f'Бот id{self._CHAT_ID}: Ответ метода ВК "messages.send": {message}')
log(False, f'Ответ бота в чат id{self._CHAT_ID}: {respond}')
def bots():
async def main():
for event in MyVkLongPoll.listen(longpoll): for event in MyVkLongPoll.listen(longpoll):
try: try:
if event.type == VkBotEventType.MESSAGE_NEW: if event.type == VkBotEventType.MESSAGE_NEW:
log(False, f'Новое сообщение в чате id{event.message.peer_id}: {event.message.text}') log(False, f'Новое сообщение: {event.message}')
debug_array['messages_get'] += 1 debug_array['messages_get'] += 1
if event.message.peer_id in bot: if event.message.peer_id in bot:
await bot[event.message.peer_id].get_message(event.message.text) bot[event.message.peer_id].get_message(event.message.text)
else: else:
bot[event.message.peer_id] = VkBot(event.message.peer_id, event.message.from_id) bot[event.message.peer_id] = VkBot(event.message.peer_id, event.message.from_id)
await bot[event.message.peer_id].get_message(event.message.text) users.append(event.message.peer_id)
bot[event.message.peer_id].get_message(event.message.text)
except Exception as kek: except Exception as kek:
err = "Беды с ботом: " + str(kek) err = "Беды с ботом: " + str(kek)
log(True, err) log(True, err)
continue continue
def midnight():
while True:
if time.time()+10800 % 86400 == 0:
for i in users:
log(False, "Иницаилизация ивента \"Миднайт\"")
bot[i].event("midnight")
tread_bots = threading.Thread(target=bots)
tread_midnight = threading.Thread(target=midnight)
tread_bots.start()
log(False, "Бот начал работу") log(False, "Бот начал работу")
debug_array['start_time'] = time.time() debug_array['start_time'] = time.time()
asyncio.run(main()) tread_midnight.start()