CloseFun Bot 1.3

mail@pastecode.io avatar
unknown
python
2 years ago
4.9 kB
2
Indexable
Never
import vk_api
from vk_api.longpoll import VkLongPoll, VkEventType
from vk_api.keyboard import VkKeyboard, VkKeyboardColor

from mcstatus import JavaServer

from os import path
import yaml

import time
import random

token = "30be428fa96b7d582b6a1a896c008beee8de9850513b67e27bceb45747fb71c0a51cf5067b24f84395c51"
vk = vk_api.VkApi(token=token)
give = vk.get_api()
longpoll = VkLongPoll(vk)

server = JavaServer.lookup("CloseFun.aternos.me:41473")

def write_message(id, text, keyboard=None):
    """Функция отправки сообщений."""
    vk.method('messages.send', {
        'user_id': id,
        'message': text,
        'random_id': 0,
        'keyboard': keyboard})
    
def get_server_status():
    """Функция для получения информации о статусе сервера."""
    status = server.status()
    players_online = status.players.online
    latency = status.latency

    status_msg = f"Сервер ответил за: {int(latency)}мс.\n\n"
    status_msg += "Адрес: CloseFun.aternos.me\n"
    status_msg += f"Пинг сервера: {int(server.ping())}мс.\n"
    status_msg += "Версия: 1.16.5.\n"
    status_msg += "Ядро: Fabric.\n"
    status_msg += f"Игроков на сервере: {players_online}. "

    if players_online == 0:
        status_msg += "Вероятно сервер выключен.\nИгроки:\nПусто"
    else:
        status_msg += "\nИгроки:\n"
        status_msg += str([f"{player.name};" for player in server.players.sample])

    return status_msg

def get_status_warning():
    """Функция отправки предупреждения вкладки 'Статус'."""
    return f"Отправляю запрос серверу. Это может занять некоторое время."
	
def add_keyboard_buttons(keyboard):
    """Функция для добавления кнопок на вк клавиатуру."""
    keyboard.add_button( "Ресурспаки", color=VkKeyboardColor.PRIMARY)
    keyboard.add_button("Координаты", color=VkKeyboardColor.PRIMARY)

    keyboard.add_line()
    keyboard.add_button("Проекты", color=VkKeyboardColor.PRIMARY)
    keyboard.add_button("Сид", color=VkKeyboardColor.PRIMARY)
    
    keyboard.add_line()
    keyboard.add_button("Статус", color=VkKeyboardColor.POSITIVE)

    keyboard.add_line()
    keyboard.add_button("Рестартнуть эту панель", color=VkKeyboardColor.NEGATIVE)

    return keyboard

def auto_restart(func):
    """Авто перезапуск функций"""
    def wrapper(*args, **kwargs):
        while True:
            try:
                func(*args,**kwargs)
                break
            except Exception as err:
                print(err)
                print("Перезапуск через 5 секунд")
                time.sleep(5)
                print("Перезапускаю...")
        return func(*args, **kwargs)
    return wrapper

@auto_restart
def main():
    """CloseFun Bot 1.3"""
    #Получение пути к скрипту
    dir_path = path.dirname(path.abspath(__file__))

    #Запись паттернов
    with open(path.join(dir_path, 'commands.yaml'), encoding='utf-8') as file:
        docs = yaml.safe_load(file)

    #Особые сообщения
    error_msg = docs['intents'][0]['responses']
    commands_msg = docs['intents'][1]['responses']

    #Цикл бота
    for event in longpoll.listen():
        if event.type == VkEventType.MESSAGE_NEW and event.to_me:
            #Конвертация сообщений в приемлемый формат
            input_message = event.text.capitalize()
            input_message = input_message.strip('!?.,()')
            input_message = input_message.replace('ё', 'е')

            id = event.user_id

            #Вызов ответа на сообщение
            for intent in docs['intents']:
                if input_message in intent['patterns']:
                    write_message(id, random.choice(intent['responses']))
                    break
            #Особые паттерны + ошибка
            else:
                if input_message in ("Начать","Рестартнуть эту панель"):
                    keyboard = VkKeyboard()
                    keyboard = add_keyboard_buttons(keyboard)
                    write_message(id, commands_msg, keyboard=keyboard.get_keyboard())

                elif input_message == "Статус":
                    write_message(id, get_status_warning())
                    auto_restart(write_message(id, get_server_status()))

                else:
                    write_message(id, error_msg)

if __name__ == "__main__":
    main()