2020-04-04 16:07:39 +00:00
import vk_api
import datetime
2020-04-11 14:40:25 +00:00
import time
2020-04-04 16:07:39 +00:00
import requests
2020-04-04 21:18:12 +00:00
import logging
2020-04-05 14:41:33 +00:00
import pyowm
2020-04-05 22:46:06 +00:00
import random
2020-04-07 16:00:49 +00:00
import json
2020-05-08 19:30:43 +00:00
import threading
2020-04-06 10:26:50 +00:00
import wikipediaapi as wiki
2020-05-05 21:33:56 +00:00
from collections import deque
2020-05-20 16:36:28 +00:00
from PIL import Image
2020-05-04 20:26:22 +00:00
from config import vk , owm , vk_mda , group_id , album_for_command , owner_id
2020-04-11 21:50:14 +00:00
from vk_api . bot_longpoll import VkBotLongPoll , VkBotEventType
2020-05-04 20:26:22 +00:00
bot = { }
2020-05-09 13:25:34 +00:00
users = { }
2020-05-04 20:26:22 +00:00
debug_array = { ' vk_warnings ' : 0 , ' logger_warnings ' : 0 , ' start_time ' : 0 , ' messages_get ' : 0 , ' messages_answered ' : 0 }
2020-05-16 19:09:52 +00:00
errors_array = { " access " : " Отказано в доступе " , " miss_argument " : " Отсуствует аргумент " }
2020-05-04 20:26:22 +00:00
2020-04-13 18:25:48 +00:00
root_logger = logging . getLogger ( )
2020-04-11 21:50:14 +00:00
root_logger . setLevel ( logging . INFO )
handler = logging . FileHandler ( ' bot.log ' , ' w ' , ' utf-8 ' )
2020-05-05 21:33:56 +00:00
handler . setFormatter ( logging . Formatter ( ' [ %(asctime)s ][ %(levelname)s ] %(message)s ' ) )
2020-04-11 21:50:14 +00:00
root_logger . addHandler ( handler )
longpoll = VkBotLongPoll ( vk , group_id )
2020-04-13 18:25:48 +00:00
2020-05-09 13:25:34 +00:00
def update_users_json ( massive ) :
with open ( " users.json " , ' w ' ) as write_file :
data = massive
json . dump ( data , write_file )
write_file . close ( )
def load_users ( ) :
try :
with open ( " users.json " , ' r ' ) as users_file :
users_not_json = json . load ( users_file )
for i in users_not_json :
users [ i ] = users_not_json [ i ]
users_file . close ( )
for i in users :
2020-05-21 19:52:49 +00:00
bot [ int ( i ) ] = VkBot ( i , users [ i ] [ " midnight " ] , users [ i ] [ ' await ' ] , int ( users [ i ] [ ' access ' ] ) )
2020-05-09 13:25:34 +00:00
except Exception as lol :
log ( True , f " Проблема с загрузкой users.json: { str ( lol ) } " )
2020-04-27 11:48:20 +00:00
def log ( warning , text ) :
if warning :
logging . warning ( text )
2020-05-04 20:26:22 +00:00
debug_array [ ' logger_warnings ' ] + = 1
2020-05-16 19:09:52 +00:00
print ( " [ " + str ( datetime . datetime . now ( ) ) + " ][WARNING] " + text )
2020-04-27 11:48:20 +00:00
else :
logging . info ( text )
2020-05-16 19:09:52 +00:00
print ( " [ " + str ( datetime . datetime . now ( ) ) + " ] " + text )
2020-04-27 11:48:20 +00:00
2020-04-13 18:25:48 +00:00
def toFixed ( numObj , digits = 0 ) :
return f " { numObj : . { digits } f } "
2020-04-11 21:50:14 +00:00
class MyVkLongPoll ( VkBotLongPoll ) :
def listen ( self ) :
while True :
2020-04-13 18:25:48 +00:00
try :
2020-04-11 21:50:14 +00:00
for event in self . check ( ) :
yield event
except Exception as e :
2020-04-27 11:48:20 +00:00
err = " Беды с В К : " + str ( e )
log ( True , err )
2020-05-04 20:26:22 +00:00
debug_array [ ' vk_warnings ' ] + = 1
2020-04-11 21:50:14 +00:00
time . sleep ( 15 )
continue
2020-04-04 16:07:39 +00:00
2020-04-13 18:25:48 +00:00
def get_weather ( place ) :
try :
weather_request = owm . weather_at_place ( place )
except pyowm . exceptions . api_response_error . NotFoundError as i :
2020-04-27 11:48:20 +00:00
err = " Ошибка OpenWeather API: " + str ( i )
log ( True , err )
2020-04-13 18:25:48 +00:00
return " Такого города нет, либо данных о погоде нет "
weather_answer = weather_request . get_weather ( )
2020-04-27 11:48:20 +00:00
info = " Результат поиска погоды через OpenWeather API: " + str ( weather_answer )
log ( False , info )
2020-04-13 18:25:48 +00:00
return " В городе " + place + " сейчас " + weather_answer . get_detailed_status ( ) + " , " + str (
round ( weather_answer . get_temperature ( ' celsius ' ) [ ' temp ' ] ) ) + " °C "
2020-04-03 21:18:34 +00:00
class VkBot :
2020-04-03 19:56:57 +00:00
2020-05-21 19:52:49 +00:00
def __init__ ( self , peer_id , midnight = False , awaiting = None , access = 1 ) :
2020-04-04 16:07:39 +00:00
2020-04-27 11:48:20 +00:00
log ( False , f " Создан объект бота! id { peer_id } " )
2020-04-05 16:24:24 +00:00
self . _CHAT_ID = peer_id
2020-05-21 19:52:49 +00:00
self . _AWAITING_INPUT_MODE = awaiting
self . _ACCESS_LEVEL = access
self . _SET_UP_REMINDER = { " task " : None , " time " : None }
2020-05-09 13:25:34 +00:00
if midnight :
self . _MIDNIGHT_EVENT = True
else :
self . _MIDNIGHT_EVENT = False
2020-04-03 19:56:57 +00:00
2020-05-11 18:24:34 +00:00
if int ( self . _CHAT_ID ) == int ( owner_id ) :
2020-05-04 20:26:22 +00:00
self . _OWNER = True
else :
self . _OWNER = False
2020-04-13 18:25:48 +00:00
self . _COMMANDS = [ " !image " , " !my_id " , " !h " , " !user_id " , " !group_id " , " !help " , " !weather " , " !wiki " , " !byn " ,
2020-05-16 19:09:52 +00:00
" !echo " , " !game " , " !debug " , " !midnight " , " !access " , " !turnoff " , " !reminder " ]
def __str__ ( self ) :
2020-05-21 19:52:49 +00:00
return f " peer_id: { str ( self . _CHAT_ID ) } , m: { str ( self . _MIDNIGHT_EVENT ) } , await: { str ( self . _AWAITING_INPUT_MODE ) } , tasks: { len ( users [ self . _CHAT_ID ] [ ' tasks ' ] ) } "
2020-05-16 19:09:52 +00:00
def __del__ ( self ) :
log ( False , f " Бот id { str ( self . _CHAT_ID ) } удалён " )
2020-04-04 16:07:39 +00:00
2020-05-08 19:30:43 +00:00
def event ( self , event ) :
if event == " midnight " and self . _MIDNIGHT_EVENT :
2020-05-09 13:25:34 +00:00
current_time = datetime . datetime . fromtimestamp ( time . time ( ) + 10800 )
2020-05-12 09:18:46 +00:00
image = None
2020-05-09 21:46:09 +00:00
2020-05-16 19:09:52 +00:00
midnight_text = [ " Миднайт! " , " Полночь! " , " Midnight! " , " миднигхт " , " Середина ночи " , " Смена даты! " ]
2020-05-09 21:46:09 +00:00
midnight_after = [ " Ложись спать! " , " P E A C E A N D T R A N Q U I L I T Y " , " Поиграй в майнкрафт " ,
2020-05-16 19:09:52 +00:00
" Втыкай в В К дальше " , " hat in time is gay " , " RIP 2013-2019 Gears for Breakfast " , " Egg " ,
" вещ или бан " , " Мой ник в игре _ичё " , " Я жил, но что-то пошло не так " ,
2020-05-21 19:52:49 +00:00
" Когда тебе похуй, ты неувязвим " , " Who ' s Afraid Of 138?! " ]
2020-05-09 21:46:09 +00:00
midnight_output = random . choice ( midnight_text ) + " <br> " + f " Наступило { current_time . strftime ( ' %d . % m. % Y ' ) } <br><br> "
2020-05-11 18:24:34 +00:00
random_thing = random . randint ( 0 , 2 )
if random_thing == 0 :
2020-05-09 21:46:09 +00:00
midnight_output + = random . choice ( midnight_after )
2020-05-11 18:24:34 +00:00
elif random_thing == 1 :
2020-05-12 09:18:46 +00:00
midnight_output + = " Картинка дня: "
image = self . random_image ( )
2020-05-11 18:24:34 +00:00
elif random_thing == 2 :
2020-05-20 16:36:28 +00:00
R = random . randint ( 0 , 255 )
G = random . randint ( 0 , 255 )
B = random . randint ( 0 , 255 )
random_color_image = Image . new ( " RGB " , ( 512 , 512 ) , ( R , G , B ) )
random_color_image . save ( " randomcolor.jpg " )
2020-05-22 20:17:00 +00:00
try :
what_send = vk_api . upload . VkUpload ( vk ) . photo_messages ( " randomcolor.jpg " , peer_id = self . _CHAT_ID )
image = " photo " + str ( what_send [ 0 ] [ ' owner_id ' ] ) + " _ " + str ( what_send [ 0 ] [ ' id ' ] )
except Exception as e :
2020-05-22 21:23:51 +00:00
midnight_output + = " Н е удалось загрузить картинку с цветом<br>"
2020-05-22 20:17:00 +00:00
log ( True , f " Проблема с отправкой картинки цвета: { str ( e ) } " )
2020-05-20 16:36:28 +00:00
midnight_output + = " Цвет дня в формате HEX: # %02x %02x %02x " % ( R , G , B )
2020-05-09 21:46:09 +00:00
2020-05-12 09:26:39 +00:00
self . send ( midnight_output , image )
log ( False , f " Бот id { self . _CHAT_ID } оповестил о миднайте " )
2020-05-08 19:30:43 +00:00
2020-05-11 18:24:34 +00:00
def get_message ( self , message , user_id ) :
2020-05-21 19:52:49 +00:00
if self . _AWAITING_INPUT_MODE :
2020-05-20 16:36:28 +00:00
if message == " Назад " :
2020-05-21 19:52:49 +00:00
self . change_await ( )
self . send ( " Отменено " )
2020-05-20 16:36:28 +00:00
else :
if self . _AWAITING_INPUT_MODE == " reminder task " :
2020-05-16 19:09:52 +00:00
self . reminder ( message , " task " )
2020-05-20 16:36:28 +00:00
self . send ( ' Когда напомнить? (время в формате дд.мм.г г чч:мм) ' )
2020-05-21 19:52:49 +00:00
self . change_await ( ' reminder time ' )
2020-05-20 16:36:28 +00:00
elif self . _AWAITING_INPUT_MODE == ' reminder time ' :
if self . reminder ( message , " time " ) :
self . send ( " Напоминание установлено " )
2020-05-21 19:52:49 +00:00
self . change_await ( )
2020-05-20 16:36:28 +00:00
else :
self . send ( " Неверный формат времени, введите время в формате дд.мм.г г чч:мм " )
2020-05-21 19:52:49 +00:00
elif self . _AWAITING_INPUT_MODE == " reminder delete " :
if self . reminder ( message , " delete " ) :
self . send ( " Напоминание удалено " )
self . change_await ( )
else :
self . send ( " Нет такого напоминания " )
elif self . _AWAITING_INPUT_MODE == " echo " :
if message == " !echo off " :
self . send ( " Эхо режим выключен " )
self . change_await ( )
log ( False , f " Бот id { self . _CHAT_ID } вышел из режима эхо " )
else :
self . send ( message )
log ( False , f " Эхо-бот id { self . _CHAT_ID } : { message } " )
2020-04-12 09:47:30 +00:00
else :
2020-05-08 19:30:43 +00:00
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 ] :
2020-05-21 19:52:49 +00:00
respond [ ' text ' ] = " Ваш ид: " + str ( user_id )
2020-05-08 19:30:43 +00:00
elif message [ 0 ] == self . _COMMANDS [ 2 ] or message [ 0 ] == self . _COMMANDS [ 5 ] :
respond [
2020-05-21 19:52:49 +00:00
' 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>!reminder *set/list/delete* - напоминалка. set устанавливает напоминание, delete удаляет, list выдаёт список ваших напоминаний<br>!h, !help - справка<br>Дата последнего обновления: 21.05.2020 (!reminder)<br>Проект бота на GitHub: https://github.com/dan63047/dan63047pythonbot "
2020-05-08 19:30:43 +00:00
elif message [ 0 ] == self . _COMMANDS [ 3 ] :
try :
respond [ ' text ' ] = self . get_info_user ( message [ 1 ] )
except IndexError :
2020-05-16 19:09:52 +00:00
respond [ ' text ' ] = errors_array [ " miss_argument " ]
2020-05-08 19:30:43 +00:00
elif message [ 0 ] == self . _COMMANDS [ 4 ] :
try :
respond [ ' text ' ] = self . get_info_group ( message [ 1 ] )
except IndexError :
2020-05-16 19:09:52 +00:00
respond [ ' text ' ] = errors_array [ " miss_argument " ]
2020-05-08 19:30:43 +00:00
elif message [ 0 ] == self . _COMMANDS [ 6 ] :
try :
respond [ ' text ' ] = get_weather ( message [ 1 ] )
except IndexError :
2020-05-16 19:09:52 +00:00
respond [ ' text ' ] = errors_array [ " miss_argument " ]
2020-05-08 19:30:43 +00:00
elif message [ 0 ] == self . _COMMANDS [ 7 ] :
try :
respond [ ' text ' ] = self . wiki_article ( message [ 1 ] )
except IndexError :
2020-05-16 19:09:52 +00:00
respond [ ' text ' ] = errors_array [ " miss_argument " ]
2020-05-08 19:30:43 +00:00
elif message [ 0 ] == self . _COMMANDS [ 8 ] :
respond [ ' text ' ] = self . exchange_rates ( )
elif message [ 0 ] == self . _COMMANDS [ 9 ] :
2020-05-21 19:52:49 +00:00
respond [ ' text ' ] = " Теперь бот работает в режиме эхо. Чтобы это выключить, введить \" !echo off \" "
self . change_await ( " echo " )
2020-05-08 19:30:43 +00:00
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 :
2020-05-16 19:09:52 +00:00
respond [ ' text ' ] = errors_array [ " miss_argument " ]
2020-05-08 19:30:43 +00:00
elif message [ 0 ] == self . _COMMANDS [ 11 ] :
2020-05-11 18:24:34 +00:00
if self . _ACCESS_LEVEL or int ( user_id ) == int ( owner_id ) :
try :
respond [ ' text ' ] = self . debug ( message [ 1 ] )
except IndexError :
respond [ ' text ' ] = self . debug ( )
else :
2020-05-16 19:09:52 +00:00
respond [ " text " ] = errors_array [ " access " ]
2020-05-08 19:30:43 +00:00
elif message [ 0 ] == self . _COMMANDS [ 12 ] :
2020-05-11 18:24:34 +00:00
if self . _ACCESS_LEVEL or int ( user_id ) == int ( owner_id ) :
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 } : Юзер подписался на ивент \" Миднайт \" " )
users [ self . _CHAT_ID ] [ " midnight " ] = self . _MIDNIGHT_EVENT
update_users_json ( users )
else :
2020-05-16 19:09:52 +00:00
respond [ ' text ' ] = errors_array [ " access " ]
2020-05-11 18:24:34 +00:00
elif message [ 0 ] == self . _COMMANDS [ 13 ] :
if int ( user_id ) == int ( owner_id ) :
try :
if message [ 1 ] == " owner " :
respond [ ' text ' ] = " Теперь некоторыми командами может пользоваться только владелец бота "
2020-05-21 19:52:49 +00:00
self . change_access ( 0 )
2020-05-11 18:24:34 +00:00
elif message [ 1 ] == " all " :
respond [ ' text ' ] = " Теперь все могут пользоваться всеми командами "
2020-05-21 19:52:49 +00:00
self . change_access ( 1 )
2020-05-11 18:24:34 +00:00
else :
respond [ ' text ' ] = " Некорректный аргумент "
except IndexError :
2020-05-16 19:09:52 +00:00
respond [ ' text ' ] = errors_array [ " miss_argument " ]
2020-05-08 19:30:43 +00:00
else :
2020-05-16 19:09:52 +00:00
respond [ ' text ' ] = errors_array [ " access " ]
elif message [ 0 ] == self . _COMMANDS [ 14 ] :
if self . _OWNER or int ( user_id ) == int ( owner_id ) :
self . send ( " Бот выключается " )
exit ( log ( False , " Принята команда на завершение работы бота. " ) )
elif message [ 0 ] == self . _COMMANDS [ 15 ] :
try :
if message [ 1 ] == " list " :
2020-05-21 19:52:49 +00:00
respond [ ' text ' ] = self . reminder ( None , " list " )
2020-05-16 19:09:52 +00:00
elif message [ 1 ] == " set " :
2020-05-21 19:52:49 +00:00
self . send ( " О чём мне вам напомнить? (Введите \" Назад \" , чтобы отменить установку) " )
self . change_await ( " reminder task " )
elif message [ 1 ] == " delete " :
if len ( users [ self . _CHAT_ID ] [ ' tasks ' ] ) == 0 :
respond [ " text " ] = " У вас не установлено ни одно напоминание"
else :
self . send ( f " Введите название напоминания, которое необходимо удалить или \" Назад \" , чтобы отменить удаление<br> { self . reminder ( None , ' list ' ) } " )
self . change_await ( " reminder delete " )
2020-05-16 19:09:52 +00:00
except IndexError :
respond [ " text " ] = errors_array [ ' miss_argument ' ]
2020-05-08 19:30:43 +00:00
if respond [ ' text ' ] or respond [ ' attachment ' ] :
self . send ( respond [ ' text ' ] , respond [ ' attachment ' ] )
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 :
2020-05-16 19:09:52 +00:00
return errors_array [ " access " ]
elif arg == " bots " :
if self . _OWNER :
answer = " Обьекты бота: "
for i in bot :
answer + = " <br> " + str ( bot [ i ] )
return answer
else :
return errors_array [ " access " ]
2020-05-08 19:30:43 +00:00
else :
up_time = time . time ( ) - debug_array [ ' start_time ' ]
time_d = int ( up_time ) / ( 3600 * 24 )
time_h = int ( up_time ) / 3600 - int ( time_d ) * 24
time_min = int ( up_time ) / 60 - int ( time_h ) * 60 - int ( time_d ) * 24 * 60
time_sec = int ( up_time ) - int ( time_min ) * 60 - int ( time_h ) * 3600 - int ( time_d ) * 24 * 60 * 60
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 (
2020-05-21 19:52:49 +00:00
debug_array [ ' messages_get ' ] ) + " (Отправлено " + str (
2020-05-08 19:30:43 +00:00
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 ' )
return answer
2020-05-04 20:26:22 +00:00
2020-05-16 19:09:52 +00:00
def reminder ( self , string , stage ) :
if stage == " task " :
2020-05-21 19:52:49 +00:00
self . _SET_UP_REMINDER [ ' task ' ] = string
2020-05-20 16:36:28 +00:00
return True
2020-05-16 19:09:52 +00:00
elif stage == " time " :
2020-05-20 16:36:28 +00:00
try :
datetime_object = time . strptime ( string , ' %d . % m. % y % H: % M ' )
2020-05-21 19:52:49 +00:00
self . _SET_UP_REMINDER [ ' time ' ] = int ( time . mktime ( datetime_object ) )
try :
users [ self . _CHAT_ID ] [ ' tasks ' ] [ self . _SET_UP_REMINDER [ ' time ' ] ] = self . _SET_UP_REMINDER [ ' task ' ]
except KeyError :
users [ self . _CHAT_ID ] . setdefault ( " tasks " , { } )
users [ self . _CHAT_ID ] [ ' tasks ' ] [ self . _SET_UP_REMINDER [ ' time ' ] ] = self . _SET_UP_REMINDER [ ' task ' ]
update_users_json ( users )
log ( False , f " Бот id { self . _CHAT_ID } : Установлено новое напоминание " )
2020-05-20 16:36:28 +00:00
return True
except ValueError :
return False
2020-05-21 19:52:49 +00:00
elif stage == " remind " :
self . send ( f " Пришло время вам напомнить: { string } " )
log ( False , f " Бот id { self . _CHAT_ID } : Напоминание сработало " )
return True
elif stage == " list " :
if len ( users [ self . _CHAT_ID ] [ ' tasks ' ] ) == 0 :
respond = " У вас не установлено ни одно напоминание"
else :
respond = ' Установленные напоминания:<br> '
for i in users [ self . _CHAT_ID ] [ ' tasks ' ] :
2020-05-22 20:12:05 +00:00
datetime_time = datetime . datetime . fromtimestamp ( int ( i ) )
2020-05-21 19:52:49 +00:00
respond + = f " <br> { datetime_time . strftime ( ' %d . % m. % y % H: % M ' ) } - { users [ self . _CHAT_ID ] [ ' tasks ' ] [ i ] } "
return respond
elif stage == " delete " :
for i in users [ self . _CHAT_ID ] [ ' tasks ' ] :
if users [ self . _CHAT_ID ] [ ' tasks ' ] [ i ] == string :
users [ self . _CHAT_ID ] [ ' tasks ' ] . pop ( i )
return True
return False
2020-05-16 19:09:52 +00:00
2020-04-13 18:25:48 +00:00
def game ( self , thing ) :
if thing == " статистика " :
with open ( " data_file.json " , " r " ) as read_file :
data = json . load ( read_file )
2020-05-09 13:25:34 +00:00
if str ( self . _CHAT_ID ) in data :
winrate = ( data [ str ( self . _CHAT_ID ) ] [ ' wins ' ] / data [ str ( self . _CHAT_ID ) ] [ ' games ' ] ) * 100
return f " Камень, ножницы, бумага<br>Сыграно игр: { data [ str ( self . _CHAT_ID ) ] [ ' games ' ] } <br>Из них:<br>•Побед: { data [ str ( self . _CHAT_ID ) ] [ ' wins ' ] } <br>•Поражений: { data [ str ( self . _CHAT_ID ) ] [ ' defeats ' ] } <br>•Ничей: { data [ str ( self . _CHAT_ID ) ] [ ' draws ' ] } <br>Процент побед: { toFixed ( winrate , 2 ) } % "
2020-04-13 18:25:48 +00:00
else :
return " Похоже, вы ещё никогда не играли в Камень, ножницы, бумага "
elif thing == " камень " or thing == " ножницы " or thing == " бумага " :
things = [ " камень " , " ножницы " , " бумага " ]
bot_thing = random . choice ( things )
if thing == " камень " and bot_thing == " ножницы " :
result = 2
elif thing == " ножницы " and bot_thing == " бумага " :
result = 2
elif thing == " бумага " and bot_thing == " камень " :
result = 2
elif thing == " ножницы " and bot_thing == " камень " :
result = 1
elif thing == " бумага " and bot_thing == " ножницы " :
result = 1
elif thing == " камень " and bot_thing == " бумага " :
result = 2
elif thing == " камень " and bot_thing == " камень " :
result = 0
elif thing == " ножницы " and bot_thing == " ножницы " :
result = 0
elif thing == " бумага " and bot_thing == " бумага " :
result = 0
if result == 2 :
response = f " Камень, ножницы, бумага<br> { thing } vs. { bot_thing } <br>Вы выиграли! "
elif result == 1 :
response = f " Камень, ножницы, бумага<br> { thing } vs. { bot_thing } <br>Вы проиграли! "
elif result == 0 :
response = f " Камень, ножницы, бумага<br> { thing } vs. { bot_thing } <br>Ничья! "
with open ( " data_file.json " , ' r ' ) as write_file :
try :
data = json . load ( write_file )
except Exception :
data = { }
2020-05-09 13:25:34 +00:00
if str ( self . _CHAT_ID ) not in data :
data [ str ( self . _CHAT_ID ) ] = { }
data [ str ( self . _CHAT_ID ) ] [ " games " ] = 0
data [ str ( self . _CHAT_ID ) ] [ " wins " ] = 0
data [ str ( self . _CHAT_ID ) ] [ " defeats " ] = 0
data [ str ( self . _CHAT_ID ) ] [ " draws " ] = 0
2020-04-13 18:25:48 +00:00
if result == 2 :
2020-05-09 13:25:34 +00:00
data [ str ( self . _CHAT_ID ) ] [ " games " ] + = 1
data [ str ( self . _CHAT_ID ) ] [ " wins " ] + = 1
2020-04-13 18:25:48 +00:00
elif result == 1 :
2020-05-09 13:25:34 +00:00
data [ str ( self . _CHAT_ID ) ] [ " games " ] + = 1
data [ str ( self . _CHAT_ID ) ] [ " defeats " ] + = 1
2020-04-13 18:25:48 +00:00
elif result == 0 :
2020-05-09 13:25:34 +00:00
data [ str ( self . _CHAT_ID ) ] [ " games " ] + = 1
data [ str ( self . _CHAT_ID ) ] [ " draws " ] + = 1
2020-04-13 18:25:48 +00:00
with open ( " data_file.json " , " w " ) as write_file :
json . dump ( data , write_file )
return response
else :
return " Неверный аргумент<br>Использование команды:<br>!game *камень/ножницы/бумага/статистика* "
2020-04-05 14:41:33 +00:00
2020-04-04 16:07:39 +00:00
def get_info_user ( self , id ) :
try :
user_info = vk . method ( ' users.get ' , { ' user_ids ' : id , ' fields ' : ' verified,last_seen,sex ' } )
except vk_api . exceptions . ApiError as lol :
2020-04-27 11:48:20 +00:00
err = " Ошибка метода users.get: " + str ( lol )
log ( True , err )
2020-04-13 18:25:48 +00:00
return " Пользователь не найден<br> " + str ( lol )
2020-04-15 10:45:05 +00:00
if " deactivated " in user_info [ 0 ] :
if user_info [ 0 ] [ ' deactivated ' ] == ' banned ' :
return user_info [ 0 ] [ ' first_name ' ] + " " + user_info [ 0 ] [ ' last_name ' ] + " забанен "
elif user_info [ 0 ] [ ' deactivated ' ] == ' deleted ' :
return " Профиль был удалён "
2020-04-15 10:36:12 +00:00
2020-04-04 16:07:39 +00:00
if user_info [ 0 ] [ ' is_closed ' ] :
is_closed = " Да "
else :
is_closed = " Нет "
if user_info [ 0 ] [ ' sex ' ] == 1 :
sex = " Женский "
elif user_info [ 0 ] [ ' sex ' ] == 2 :
sex = " Мужской "
else :
sex = " Неизвестно "
if user_info [ 0 ] [ ' last_seen ' ] [ ' platform ' ] == 1 :
platform = " m.vk.com "
elif user_info [ 0 ] [ ' last_seen ' ] [ ' platform ' ] == 2 :
platform = " iPhone "
elif user_info [ 0 ] [ ' last_seen ' ] [ ' platform ' ] == 3 :
platform = " iPad "
elif user_info [ 0 ] [ ' last_seen ' ] [ ' platform ' ] == 4 :
platform = " Android "
elif user_info [ 0 ] [ ' last_seen ' ] [ ' platform ' ] == 5 :
platform = " Windows Phone "
elif user_info [ 0 ] [ ' last_seen ' ] [ ' platform ' ] == 6 :
platform = " Windows 10 "
elif user_info [ 0 ] [ ' last_seen ' ] [ ' platform ' ] == 7 :
platform = " vk.com "
else :
platform = " тип платформы неизвестен "
time = datetime . datetime . fromtimestamp ( user_info [ 0 ] [ ' last_seen ' ] [ ' time ' ] )
2020-04-27 11:48:20 +00:00
answer = user_info [ 0 ] [ ' first_name ' ] + " " + user_info [ 0 ] [ ' last_name ' ] + " <br>Е г о ид: " + \
str ( user_info [ 0 ] [ ' id ' ] ) + " <br>Профиль закрыт: " + is_closed + " <br>Пол: " + sex \
+ " <br>Последний онлайн: " + time . strftime ( ' %d . % m. % Y в % H: % M: % S ' ) + " ( " + platform + " ) "
2020-04-04 16:07:39 +00:00
return answer
def get_info_group ( self , id ) :
try :
group_info = vk . method ( ' groups.getById ' , { ' group_id ' : id , ' fields ' : ' description,members_count ' } )
except vk_api . exceptions . ApiError as lol :
2020-04-27 11:48:20 +00:00
err = " Ошибка метода groups.getById: " + str ( lol )
log ( True , err )
2020-04-13 18:25:48 +00:00
return " Группа не найдена<br> " + str ( lol )
2020-04-27 11:48:20 +00:00
info = " Результат метода API groups.getById: " + str ( group_info )
log ( False , info )
2020-04-04 16:07:39 +00:00
if group_info [ 0 ] [ ' description ' ] == " " :
description = " Отсутствует "
else :
description = group_info [ 0 ] [ ' description ' ]
2020-04-13 18:25:48 +00:00
answer = group_info [ 0 ] [ ' name ' ] + " <br>Описание: " + description + " <br>Ид группы: " + str (
group_info [ 0 ] [ ' id ' ] ) + " <br>Подписчиков: " + str ( group_info [ 0 ] [ ' members_count ' ] )
2020-04-04 16:07:39 +00:00
return answer
2020-04-03 19:56:57 +00:00
2020-04-05 22:46:06 +00:00
def random_image ( self ) :
2020-05-05 21:33:56 +00:00
group = " - " + str ( group_id )
2020-04-13 18:25:48 +00:00
random_images_query = vk_mda . method ( ' photos.get ' ,
2020-05-04 20:26:22 +00:00
{ ' owner_id ' : group , ' album_id ' : album_for_command , ' count ' : 1000 } )
2020-04-27 11:48:20 +00:00
info = " Результат метода photos.get: Получено " + str ( random_images_query [ ' count ' ] ) + " фото "
log ( False , info )
2020-04-06 10:26:50 +00:00
random_number = random . randrange ( random_images_query [ ' count ' ] )
2020-04-13 18:25:48 +00:00
return " photo " + str ( random_images_query [ ' items ' ] [ random_number ] [ ' owner_id ' ] ) + " _ " + str (
random_images_query [ ' items ' ] [ random_number ] [ ' id ' ] )
2020-04-05 22:46:06 +00:00
2020-04-06 10:26:50 +00:00
def wiki_article ( self , search ) :
w = wiki . Wikipedia ( ' ru ' )
page = w . page ( search )
if page . exists ( ) :
2020-04-13 18:25:48 +00:00
answer = page . title + " <br> " + page . summary
2020-04-06 10:26:50 +00:00
else :
answer = " Такой статьи не существует "
return answer
2020-05-08 19:30:43 +00:00
def exchange_rates ( self ) :
2020-04-10 16:06:15 +00:00
try :
2020-04-13 18:25:48 +00:00
rates_USD = json . loads (
requests . get ( " https://www.nbrb.by/api/exrates/rates/145?periodicity=0 " , timeout = 10 ) . text )
rates_EUR = json . loads (
requests . get ( " https://www.nbrb.by/api/exrates/rates/292?periodicity=0 " , timeout = 10 ) . text )
rates_RUB = json . loads (
requests . get ( " https://www.nbrb.by/api/exrates/rates/298?periodicity=0 " , timeout = 10 ) . text )
return " Текущий курс валют по данным НБ РБ:<br> " + rates_USD [ ' Cur_Name ' ] + " : " + str (
rates_USD [ ' Cur_Scale ' ] ) + " " + rates_USD [ ' Cur_Abbreviation ' ] + " = " + str (
rates_USD [ ' Cur_OfficialRate ' ] ) + " BYN<br> " + rates_EUR [ ' Cur_Name ' ] + " : " + str (
rates_EUR [ ' Cur_Scale ' ] ) + " " + rates_EUR [ ' Cur_Abbreviation ' ] + " = " + str (
rates_EUR [ ' Cur_OfficialRate ' ] ) + " BYN<br> " + " Российский рубль " + " : " + str (
rates_RUB [ ' Cur_Scale ' ] ) + " " + rates_RUB [ ' Cur_Abbreviation ' ] + " = " + str (
rates_RUB [ ' Cur_OfficialRate ' ] ) + " BYN "
2020-04-10 16:06:15 +00:00
except Exception as mda :
2020-04-27 11:48:20 +00:00
err = " Ошибка получения данных из НБ РБ API: " + str ( mda )
log ( True , err )
2020-04-13 18:25:48 +00:00
return " Невозможно получить данные из НБ РБ: " + str ( mda )
2020-04-10 16:06:15 +00:00
2020-05-21 19:52:49 +00:00
def change_await ( self , awaiting = None ) :
self . _AWAITING_INPUT_MODE = awaiting
try :
users [ self . _CHAT_ID ] [ ' await ' ] = self . _AWAITING_INPUT_MODE
except KeyError :
users [ self . _CHAT_ID ] . setdefault ( " tasks " , None )
users [ self . _CHAT_ID ] [ ' await ' ] = self . _AWAITING_INPUT_MODE
update_users_json ( users )
def change_access ( self , level ) :
self . _ACCESS_LEVEL = level
try :
users [ self . _CHAT_ID ] [ ' access ' ] = self . _ACCESS_LEVEL
except KeyError :
users [ self . _CHAT_ID ] . setdefault ( " tasks " , None )
users [ self . _CHAT_ID ] [ ' access ' ] = self . _ACCESS_LEVEL
update_users_json ( users )
2020-05-08 19:30:43 +00:00
def send ( self , message = None , attachment = None ) :
message = vk . method ( ' messages.send ' ,
{ ' peer_id ' : self . _CHAT_ID , ' message ' : message , ' random_id ' : time . time ( ) ,
' attachment ' : attachment } )
log ( False , f ' Бот id { self . _CHAT_ID } : Ответ метода В К " messages.send " : { message } ' )
2020-05-16 19:09:52 +00:00
debug_array [ ' messages_answered ' ] + = 1
2020-05-09 13:25:34 +00:00
2020-04-03 19:56:57 +00:00
2020-05-08 19:30:43 +00:00
def bots ( ) :
2020-05-09 13:25:34 +00:00
log ( False , " Бот начал работу " )
debug_array [ ' start_time ' ] = time . time ( )
2020-04-11 21:50:14 +00:00
for event in MyVkLongPoll . listen ( longpoll ) :
try :
if event . type == VkBotEventType . MESSAGE_NEW :
2020-05-22 20:12:05 +00:00
if event . message . attachments :
atch = ' '
for i in event . message . attachments :
2020-05-22 21:23:51 +00:00
if i [ ' type ' ] == " sticker " :
atch + = f " sticker_id { i [ i [ ' type ' ] ] [ ' sticker_id ' ] } "
else :
atch + = i [ ' type ' ] + str ( i [ i [ ' type ' ] ] [ ' owner_id ' ] ) + " _ " + str ( i [ i [ ' type ' ] ] [ ' id ' ] ) + " "
2020-05-22 20:12:05 +00:00
else :
atch = " nothing "
2020-05-22 21:23:51 +00:00
log ( False , f ' Новое сообщение: peer_id: { event . message . peer_id } , user_id: { event . message . from_id } , text: " { event . message . text } " , attachments: { atch } ' )
2020-05-04 20:26:22 +00:00
debug_array [ ' messages_get ' ] + = 1
2020-05-09 13:25:34 +00:00
if int ( event . message . peer_id ) in bot :
2020-05-11 18:24:34 +00:00
bot [ event . message . peer_id ] . get_message ( event . message . text , event . message . from_id )
2020-04-11 21:50:14 +00:00
else :
2020-05-09 13:25:34 +00:00
bot [ event . message . peer_id ] = VkBot ( event . message . peer_id )
2020-05-21 19:52:49 +00:00
users [ event . message . peer_id ] = { " midnight " : False , " tasks " : { } , " await " : None , " access " : 1 }
2020-05-09 13:25:34 +00:00
update_users_json ( users )
2020-05-11 18:24:34 +00:00
bot [ event . message . peer_id ] . get_message ( event . message . text , event . message . from_id )
2020-05-22 20:12:05 +00:00
elif event . type == VkBotEventType . WALL_POST_NEW :
log ( False , f " Н а стене группы опубликован новый пост id{ event . object . id } : { event . object . text } " )
else :
log ( False , str ( event ) )
2020-04-11 21:50:14 +00:00
except Exception as kek :
2020-04-27 11:48:20 +00:00
err = " Беды с ботом: " + str ( kek )
log ( True , err )
2020-04-13 18:25:48 +00:00
continue
2020-04-11 21:50:14 +00:00
2020-05-08 19:30:43 +00:00
def midnight ( ) :
while True :
2020-05-09 13:25:34 +00:00
current_time = time . time ( ) + 10800
if int ( current_time ) % 86400 == 0 :
log ( False , " Иницаилизация ивента \" Миднайт \" " )
2020-05-08 19:30:43 +00:00
for i in users :
2020-05-09 18:40:11 +00:00
bot [ int ( i ) ] . event ( " midnight " )
2020-05-09 21:46:09 +00:00
log ( False , " Ивент \" Миднайт \" завершён " )
2020-05-09 13:25:34 +00:00
time . sleep ( 1 )
else :
time . sleep ( 0.50 )
2020-05-08 19:30:43 +00:00
2020-05-21 19:52:49 +00:00
def check_tasks ( ) :
while True :
try :
for i in users :
current_time = time . time ( ) + 10800
if " tasks " in users [ i ] :
try :
for n in users [ i ] [ " tasks " ] :
if int ( n ) == int ( current_time ) :
bot [ int ( i ) ] . reminder ( users [ i ] [ ' tasks ' ] [ n ] , " remind " )
users [ i ] [ ' tasks ' ] . pop ( n )
update_users_json ( users )
except RuntimeError :
continue
except RuntimeError :
continue
2020-05-22 20:12:05 +00:00
time . sleep ( 0.3 )
2020-05-21 19:52:49 +00:00
2020-05-08 19:30:43 +00:00
2020-05-09 13:25:34 +00:00
log ( False , " Скрипт запущен, чтение users.json для восстановления обьектов ботов " )
load_users ( )
2020-05-08 19:30:43 +00:00
tread_bots = threading . Thread ( target = bots )
2020-05-22 20:12:05 +00:00
tread_midnight = threading . Thread ( target = midnight , daemon = True )
tread_tasks = threading . Thread ( target = check_tasks , daemon = True )
2020-05-08 19:30:43 +00:00
tread_bots . start ( )
tread_midnight . start ( )
2020-05-21 19:52:49 +00:00
tread_tasks . start ( )
2020-05-08 19:30:43 +00:00