Esempio n. 1
0
import hues

from plugin_system import Plugin
import publicsuffixlist
import pickle
import os

psl = publicsuffixlist.PublicSuffixList()

plugin = Plugin(
    'Послать сообщение',
    usage=[
        "напиши [id] [сообщение] - написать сообщение пользователю",
        "скрыть [id] - не получать сообщения от пользователя",
        "показать [id] - получать сообщения от пользователя",
        "небеспокоить - не получать сообщения вообще",
        "беспокоить - получать сообщения от пользователей, не в вашем чёрном списке"
    ])

black_list = {}
muted = {}

if not os.path.exists("plugins/temp/msg_sender_data"):
    os.makedirs("plugins/temp/msg_sender_data")

try:
    with open('plugins/temp/msg_sender_data/bl.pkl', 'rb') as f:
        black_list = pickle.load(f)
except:
    pass
Esempio n. 2
0
from plugin_system import Plugin
from settings import ACCEPT_FRIENDS, IS_GROUP
from utils import schedule_coroutine

if ACCEPT_FRIENDS:
    plugin = Plugin("Автоматическое добавление друзей(каждые 10 секунд)")

    @plugin.on_init()
    async def get_vk(vk):
        if not IS_GROUP:
            schedule_coroutine(add_friends(vk))

    # Функция, если её запустить(см. get_vk для примера с выполнением в фоне),
    # будет выполняться каждые 10 секунд, до тех пор, пока stopper.stop == False
    #
    # Функция обязана принимать 1 обязательны параметр - stopper, но может
    # принимать и больше
    @plugin.schedule(10)
    async def add_friends(stopper, vk):
        result = await vk.method("friends.getRequests")

        if not result or not result["count"]:
            return

        users = result["items"]

        for user in users:
            await vk.method("friends.add", {"user_id": user})
Esempio n. 3
0
import io

import qrcode
from qrcode.exceptions import DataOverflowError

from plugin_system import Plugin
plugin = Plugin(
    "QRCode генератор",
    usage=["qr [текст / ссылка] - генерирует QR код с вашим текстом"])


@plugin.on_command('qr')
async def command(msg, args):
    if not args:
        await msg.answer('Введите слова или ссылку чтобы сгенерировать qr код')

    qr = qrcode.QRCode(
        error_correction=qrcode.constants.ERROR_CORRECT_L,
        box_size=10,
        border=4,
    )

    qr.add_data(msg.text)

    try:
        qr.make(fit=True)
    except DataOverflowError:
        return await msg.answer('Слишком длинное сообщение!')

    img = qr.make_image()
Esempio n. 4
0
import aiohttp

from plugin_system import Plugin

plugin = Plugin(
    "Скриншот любого сайта",
    usage=["скрин [адрес сайта] - сделать скриншот сайта [адрес сайта]"])


# Желательно первой командой указывать основную (она будет в списке команд)
@plugin.on_command('скрин')
async def screen(msg, args):
    if not args:
        return msg.answer('Вы не указали сайт!')

    async with aiohttp.ClientSession() as sess:
        async with sess.get("http://mini.s-shot.ru/1024x768/1024/png/?" +
                            args.pop()) as resp:
            result = await msg.vk.upload_photo(await resp.read())

            return await msg.answer('Держи', attachment=str(result))
Esempio n. 5
0
import aiohttp

from plugin_system import Plugin

plugin = Plugin(
    'Курсы валют',
    usage='курс - узнать курс доллара, евро, и фунта к рублю\n'
    'сколько {валюты} в {кол-во} {валюте} - узнать курс между 2 валютами')


async def get_rate(first: str, to: str = "RUB"):
    async with aiohttp.ClientSession() as sess:
        async with sess.get(
                f"http://api.fixer.io/latest?base={first}") as resp:
            try:
                data = await resp.json()
                return data['rates'][to]
            except (KeyError, IndexError):
                raise ValueError('Курса данной валюты не найдено')


@plugin.on_command('курс', 'валюта')
async def get_rates(msg, args):
    data = []
    for cur in ('USD', 'EUR', 'GBP'):
        data.append(await get_rate(cur))
    usd, eur, gbp = data
    vk_message = (f"1 Доллар = {usd} руб.\n"
                  f"1 Евро = {eur} руб.\n"
                  f"1 Фунт = {gbp} руб\n")
    await msg.answer(vk_message)
Esempio n. 6
0
from plugin_system import Plugin

plugin = Plugin('Список плагинов',
                usage='плагины - показать список загруженных плагинов')


@plugin.on_command('плагины')
async def call(msg, args):
    await msg.answer('Загруженные плагины:\n' +
                     '\n'.join(pl.name for pl in msg.vk.get_plugins()))
Esempio n. 7
0
from plugin_system import Plugin

plugin = Plugin('Блокнот',
                usage='запомни [строка] - запомнить строку\n'
                      'напомни - напомнить строку')

memoes = {}


@plugin.on_command('запомни', 'запиши')
async def memo_write(msg, args):
    string = ' '.join(args)
    memoes[msg.id] = string
    await msg.answer('Вроде запомнил...')


@plugin.on_command('напомни', 'вспомни')
async def memo_read(msg, args):
    string = memoes.get(msg.id, "Ничего")
    await msg.answer('Вот что я вспомнил:\n' + string)
Esempio n. 8
0
from plugin_system import Plugin
from settings import ADMINS
plugin = Plugin('Сообщение админу',
                usage='админу [текст] - отослать администрации сообщение')


@plugin.on_command('админу')
async def toadmin(msg, args):
    data = ' '.join(args)
    sender_data = await msg.vk.method('users.get', {
        'user_ids': msg.id,
        'name_case': "gen"
    })
    sender_data = sender_data[0]
    for uid in ADMINS:
        val = {
            'peer_id':
            uid,
            'message':
            f"Сообщение от {sender_data['first_name']} {sender_data['last_name']}, (vk.com/id{msg.id}):\n\"{data}\"",
        }

        if "attach1" in msg.brief_attaches:
            val['attachment'] = ",".join(
                str(x) for x in await msg.full_attaches)

        result = await msg.vk.method('messages.send', val)
    if not result:
        return await msg.answer('Сообщение не удалось отправить!')
    await msg.answer('Сообщение успешно отправлено!')
Esempio n. 9
0
import time

import aiohttp
import hues

from plugin_system import Plugin
from utils import schedule_coroutine

plugin = Plugin("Погода в вашем городе", usage="погода - погода")

# сервис для определения погоды: http://openweathermap.org/api
# введите свой ключ, если будете использовать!
code = "fe198ba65970ed3877578f728f33e0f9"
default_city = "Астрахань"

text_to_days = {
    "завтра": 1,
    "послезавтра": 2,
    "через день": 2,
    "через 1 день": 2,
    "через 2 дня": 3,
    "через 3 дня": 4,
    "через 4 дня": 5,
    "через 5 дней": 6,
    "через 6 дней": 7,
    "через 7 дней": 8
}

if code == "fe198ba65970ed3877578f728f33e0f9":
    hues.warn(
        "Вы используете общественный ключ для openweathermap.org! Рекомендуем вам получить личный!"
Esempio n. 10
0
import random

from plugin_system import Plugin
from utils import load_settings
from database import *

plugin = Plugin('Видео группы',
                usage='случайное видео - прислать случайное видео из группы')


class UserVideos(BaseModel):
    user_id = peewee.BigIntegerField(unique=True)
    video_list = peewee.TextField(default='')


UserVideos.create_table(True)


@plugin.on_init()
async def check_group_videos(vk):
    plugin.temp_data['s'] = load_settings(plugin)
    # Получаем количество видео в группе
    values = {'owner_id': -int(plugin.temp_data['s']['public_id']), 'count': 0}
    resp = await vk.method('video.get', values)
    if resp:
        plugin.temp_data['public_video_count'] = resp.get('count')


@plugin.on_command('случайное видео')
async def send_videos(msg, args):
    """Отправляет пользователю видео из группы, записывает в базу уже отправленные"""
Esempio n. 11
0
import random

from database import *
from plugin_system import Plugin
from utils import load_settings

plugin = Plugin(
    'Узнать кто находится в беседе',
    usage=[
        'кто здесь - узнать членов беседы в которой вы введёте эту команду.'
    ])


@plugin.on_init()
async def init(vk):
    plugin.temp_data = load_settings(plugin)


emojis = [
    '😏', '😄', '😠', '😆', '🤐', '😝', '🤔', '😎', '😐', '🙁', '😨', '🤔', '😠', '😝', '😘',
    '😗', '😙', '😙', '😟'
]


@plugin.on_command('кто здесь', 'ктоздесь')
async def who_is_here(msg, args):
    if msg.conf:
        all_users = await msg.vk.method("messages.getChatUsers", {
            'chat_id': msg.cid,
            'fields': 'name,online'
        })
Esempio n. 12
0
import random
from plugin_system import Plugin

plugin = Plugin('Случайные мемы', usage='мемы - показать случайный мем')

answers = '''Мемы поданы!
Классный мемес!
Знакомься, мемасик
'''.splitlines()


@plugin.on_command('мемы', 'мемасики', 'мем', 'мемчики', 'мемасик', 'мемосы')
async def call(msg, args):
    photo = False
    data = None

    while not photo:
        values = {
            # owner_id = ид группы
            'owner_id': -129950840,
            'offset': random.randint(1, 400),
            'count': 5
        }

        data = await msg.vk.method('wall.get', values)
        data = data['items'][0]
        if 'attachments' in data:
            if 'photo' in data['attachments'][0]:
                photo = True

    attrs = data['attachments'][0]['photo']
Esempio n. 13
0
import random
from plugin_system import Plugin

usage = """рандом (от) (до) - случайное число в диапазоне (от, до)
Если нет "до", то диапазон (1, от). Если нет "от", то диапазон (1, 6)"""

plugin = Plugin('Рандом', usage=usage)


@plugin.on_command('рандом', 'случайно', 'кубик')
async def call(msg, args):
    try:
        args = [int(arg) for arg in args]
    except ValueError:
        return await msg.answer("Один из аргументов - не число")
    # Если у нас два аргумента - это диапазон
    if len(args) == 2:
        start, end = args
        # Конечное значение больше начального
        if abs(end - start) > 0:
            num = random.randint(start, end)
        # Конечное число меньше начального
        else:
            num = random.randint(end, start)
    # Если один аргумент, то диапазон будет - (1, число)
    elif len(args) == 1:
        num = random.randint(1, args[0])
    # Если нет аргументов, то диапазон, как в игральном кубике
    else:
        num = random.randint(1, 6)
Esempio n. 14
0
from plugin_system import Plugin

plugin = Plugin(
    "Калькулятор",
    usage="посчитать [выражение] - посчитать результат с помощью калькулятора")

# def is_number(str):

# @plugin.on_command('посчитать')
# def calc():
Esempio n. 15
0
from database import *
from plugin_system import Plugin

plugin = Plugin('Контроль бота (только для админов)',
                usage=['выключить - выключает бота',
                       'добавить в белый список [id] - добавить пользователя с id в белый список',
                       'убрать из белого списка [id] - убрать пользователя с id из белого списка',
                       'добавить в чёрный список [id] - добавить пользователя с id в чёрный список',
                       'убрать из чёрного списка [id] - убрать пользователя с id из чёрного списка',
                       'сделать админом [id] - добавить пользователя с id в список админов',
                       'убрать из админов [id] - убрать пользователя с id в список админов',
                       'чёрный список - показать чёрный список'
                       'белый список - показать белый список',
                       'админы - показать админов'])


@plugin.on_command('выключить')
async def shutdown(msg, args):
    if await get_or_none(Role, user_id=msg.user_id, role="admin"):
        await msg.answer('Выключаюсь, мой господин...')
        exit()
    else:
        await msg.answer('Я бы с радостью, но вы не мой администратор :)')


@plugin.on_command('добавить в белый список')
async def add_to_whitelist(msg, args):
    return await add_to_list(msg, args, "whitelisted")


@plugin.on_command('добавить в чёрный список')
Esempio n. 16
0
import random
from plugin_system import Plugin

plugin = Plugin("Случайные посты с 2ch")

answers = ["Каеф", "Не баян (баян)", "Ну держи!", "🌚"]


@plugin.on_command('двач', '2ch', 'двачик')
async def get_memes(msg, args):
    isphoto = False
    boobs = None

    while isphoto is False:
        values = {
            # owner_id = ид группы
            'owner_id': -22751485,
            'offset': random.randint(1, 1985),
            'count': 1
        }

        boobs = await msg.vk.method('wall.get', values)
        if 'attachments' in boobs['items'][0]:
            if 'photo' in boobs['items'][0]['attachments'][0]:
                isphoto = True

    boobs_att = boobs['items'][0]['attachments'][0]['photo']

    owner_id = str(boobs_att['owner_id'])
    att_id = str(boobs_att['id'])
    access_key = str(boobs_att['access_key'])
Esempio n. 17
0
import hues

from plugin_system import Plugin

plugin = Plugin(
    "Отправка анонимного сообщения",
    usage=[
        "анонимно [id] [сообщение] - написать анонимное сообщение пользователю"
        "(посылать можно только текст и/или фото)",
        "неполучатьанонимки - не получать анонимные сообщения",
        "получатьанонимки - получать анонимные сообщения"
    ])

DISABLED = ('https', 'http', 'com', 'www', 'ftp', '://')


def check_links(string):
    return any(x in string for x in DISABLED)


@plugin.on_init()
def init(vk):
    if "donotdisturb" not in plugin.data:
        plugin.data["donotdisturb"] = {}
    else:
        for k in plugin.data["donotdisturb"]:
            plugin.data["donotdisturb"][int(
                k)] = plugin.data["donotdisturb"].pop(k)


@plugin.on_command('анонимка', 'анонимно')
Esempio n. 18
0
# -*- coding: utf-8 -*-

import random

from plugin_system import Plugin

plugin = Plugin(
    'Шар предсказаний',
    usage=['шар [строка] - вероятность того, что высказывание правдиво'])
# Инициализируем возможные ответы
answers = '''Абсолютно точно!
Да.
Нет.
Скорее да, чем нет.
Не уверен...
Однозначно нет!
Если ты не фанат аниме, у тебя все получится!
Можешь быть уверен в этом.
Перспективы не очень хорошие.
А как же иначе?.
Да, но если только ты не смотришь аниме.
Знаки говорят — «да».
Не знаю.
Мой ответ — «нет».
Весьма сомнительно.
Не могу дать точный ответ.
'''.splitlines()


@plugin.on_command('правда', 'предсказание', 'реши', 'шар')
async def tell_truth(msg, args):
Esempio n. 19
0
import random
import requests
from plugin_system import Plugin

plugin = Plugin('Шутки', usage='пошути - написать случайный анекдот')

answers = '''А вот и шуточки подъехали!!!
Сейчас будет смешно, зуб даю!
Шуточки заказывали?
Петросян в душе прям бушует :)
'''.splitlines()


@plugin.on_command('шутка', 'пошути', 'рассмеши')
async def joke_get(msg, args):
    resp = requests.post('http://www.umori.li/api/random?num=10')
    try:
        print(resp.content)
        joke = resp.json()['joke']['text']
    except:
        return await msg.answer("У меня шутилка сломалась :(")

    await msg.answer(random.choice(answers) + '\n' + str(joke))
Esempio n. 20
0
import io
import requests

from PIL import Image

from plugin_system import Plugin
import publicsuffixlist

psl = publicsuffixlist.PublicSuffixList()

plugin = Plugin('Зеркало', usage="отзеркаль <прикреплённые фото> - ")

FAIL_MSG = 'К сожалению, произошла какая-то ошибка :('


@plugin.on_command('отзеркаль')
async def mirror(msg, args):
    photo = False
    for k, v in msg.brief_attaches.items():
        if '_type' in k and v == "photo":
            photo = True
            break

    if not photo:
        return await msg.answer('Вы не прислали фото!')

    attach = (await msg.full_attaches)[0]
    response = requests.get(attach.link)
    img = Image.open(io.BytesIO(response.content))

    w, h = img.size
Esempio n. 21
0
from database import *
from plugin_system import Plugin

plugin = Plugin(
    "Отправка сообщения",
    usage=[
        "напиши [id] [сообщение] - написать сообщение пользователю",
        "анонимно [id] [сообщение] - написать анонимное сообщение пользователю"
        "(посылать можно только текст и/или фото)",
        "не беспокоить - не получать сообщения",
        "беспокоить - получать сообщения"
    ],
    need_db=True)

DISABLED = ('https', 'http', 'com', 'www', 'ftp', '://')


def check_links(string):
    return any(x in string for x in DISABLED)


@plugin.on_init()
def init(vk):
    pass


@plugin.on_command('анонимка', 'анонимно')
async def anonymously(msg, args):
    text_required = True
    for k, v in msg.brief_attaches.items():
        if '_type' in k and v == "photo":
Esempio n. 22
0
from plugin_system import Plugin

plugin = Plugin('Помощь', usage='команды - узнать список доступных команд')


@plugin.on_command('команды', 'помоги', 'помощь')
async def call(msg, args):
    usages = '\n\n✏ '.join(pl.usage for pl in msg.vk.get_plugins() if pl.usage)
    await msg.answer(f"⭐ Доступные команды: \n✏ {usages}")
Esempio n. 23
0
import random

from plugin_system import Plugin
usage = [
    'двач - случайная фотка с двача',
    'мемы - случайная фотка из https://vk.com/public129950840'
]

plugin = Plugin("Случайные посты из пабликов", usage=usage)

answers = ["Каеф", "Не баян (баян)", "Ну держи!", "🌚"]


async def give_memes(msg, group_id):
    """Получает фотографию из случайного поста выбранной группы"""
    photo = None

    values = {
        # owner_id = ид группы
        'owner_id': group_id,
        'offset': random.randint(1, 1985),
        'count': 1
    }

    # Пока мы не нашли фотографию
    while not photo:
        data = await msg.vk.method('wall.get', values)
        attaches = data['items'][0].get('attachments')
        if attaches:
            photo = attaches[0].get('photo')
Esempio n. 24
0
import random

from plugin_system import Plugin

usage = """рандом (от) (до) - случайное число в диапазоне (от, до)
Если нет "до", то диапазон (1, от). Если нет "от", то диапазон (1, 6)"""

plugin = Plugin(
    'Рандом',
    usage=[
        'рандом (от) (до) - случайное число в диапазоне (от, до)\n'
        'Если нет "до", то диапазон (1, от). Если нет "от", то диапазон (1, 6)'
    ])


@plugin.on_command('рандом', 'случайно', 'кубик')
async def call(msg, args):
    try:
        args = [int(arg) for arg in args]
    except ValueError:
        return await msg.answer("Один из аргументов - не число")

    # Если у нас два аргумента - это диапазон
    if len(args) == 2:
        start, end = args
        # Конечное значение больше начального
        if abs(end - start) > 0:
            num = random.randint(start, end)
        # Конечное число меньше начального
        else:
            num = random.randint(end, start)
Esempio n. 25
0
import hues

from plugin_system import Plugin
import publicsuffixlist
import pickle
import os

psl = publicsuffixlist.PublicSuffixList()

plugin = Plugin('Послать сообщение',
                usage='''напиши [id] [сообщение] - написать сообщение пользователю
                скрыть [id] - не получать сообщения от пользователя
                показать [id] - получать сообщения от пользователя
                небеспокоить - не получать сообщения вообще
                беспокоить - получать сообщения от пользователей, не в вашем чёрном списке'''.split("\n"))

black_list = {}
muted = {}

if not os.path.exists("plugins/msg_sender_data"):
    os.makedirs("plugins/msg_sender_data")

try:
    with open('plugins/msg_sender_data/bl.pkl', 'rb') as f:
        black_list = pickle.load(f)
except:
    pass

try:
    with open('plugins/msg_sender_data/m.pkl', 'rb') as f:
        muted = pickle.load(f)
Esempio n. 26
0
from random import sample

from plugin_system import Plugin

plugin = Plugin("Кто в кого влюблён", usage=['кто кого - поиск парочек в беседе'])


@plugin.on_command('кто кого', 'ктокого')
async def gay_search(msg, args):
    if msg.conf:
        users = await msg.vk.method('messages.getChatUsers', {'chat_id': msg.cid, 'fields': 'name'})
        love1, love2 = sample(users, 2)
        await msg.answer(f"[id{love1['id']}|{love1['first_name']} {love1['last_name']}] - ❤ Любит ❤ - "
                         f"[id{love2['id']}|{love2['first_name']} {love2['last_name']}]")

    else:
        await msg.answer("Эту команду можно использовать только в беседе.")
Esempio n. 27
0
    2: "Февраль",
    3: "Март",
    4: "Апрель",
    5: "Май",
    6: "Июнь",
    7: "Июль",
    8: "Август",
    9: "Сентябрь",
    10: "Октябрь",
    11: "Ноябрь",
    12: "Декабрь"
}
diary = None

plugin = Plugin('Уроки edu.tatar.ru',
                usage="уроки (число) - просмотреть расписание и задания "
                "на сегодня, или на (число)")


async def get_diary():
    async with aiohttp.ClientSession() as sess:
        async with sess.post(LOGIN_URL,
                             headers=HEADERS,
                             data=AUTH_DATA,
                             allow_redirects=False) as resp:
            sess._cookie_jar.update_cookies({"DNSID": resp.cookies['DNSID']})
            async with sess.get(DIARY_URL) as diary:
                async with sess.get(DIARY_URL) as diary:
                    return await diary.text()

Esempio n. 28
0
from plugin_system import Plugin
from vbot import VERSION

plugin = Plugin("Информация о боте",
                usage=["о боте - вывод информации о боте"])


@plugin.on_command('about', "о боте")
async def command(msg, args):
    message = "🌍 VBot 🌍\n" \
              "🌲 VBot - бот, написанный на языке программирования Python, способный выполнять различные " \
              "команды, которые он может получать от пользователей. Бот может работать как пользователь или как " \
              "группа. Этот бот может развлекать и поддерживать конференции, группы и просто быть приятным " \
              "времяпровождением.\n" \
              "🌲 Версия: " + VERSION + "\n" \
              "🌲 https://github.com/VKBots/VBot"

    return await msg.answer(message)
Esempio n. 29
0
from plugin_system import Plugin

plugin = Plugin('Поиск видео',
                usage='видео [строка для поиска] - найти видео по запросу')


@plugin.on_command('видео', 'видяшки', 'видос', 'видосик')
async def video_search(msg, args):
    # Если нет аргументов
    if not args:
        return await msg.answer('Какое видео вас интересует?')

    query = ' '.join(args)
    params = {
        'q': query,
        'sort': 2,  # Сортировка по релевантности
        'adult': 0,  # Включить "взрослый" контент
        'count': 5  # Кол-во результатов
    }
    resp = await msg.vk.method('video.search', params)
    vids = resp.get('items')
    # Если не нашли ни одного видео
    if not vids:
        return await msg.answer('Ничего не найдено')
    resp = ','.join(f"video{vid['owner_id']}_{vid['id']}" for vid in vids)
    await msg.answer('Приятного просмотра!', attachment=resp)
Esempio n. 30
0
import aiohttp

from plugin_system import Plugin

plugin = Plugin('Курсы валют',
                usage='курс - узнать курс доллара, евро, и фунта к рублю')


async def get_rate(first: str, to: str = "RUB"):
    async with aiohttp.ClientSession() as sess:
        async with sess.get(
                f"http://api.fixer.io/latest?base={first}") as resp:
            try:
                data = await resp.json()
                return data['rates'][to]
            except (KeyError, IndexError):
                raise ValueError('Курса данной валюты не найдено')


@plugin.on_command('курс', 'валюта')
async def get_rates(msg, args):
    data = []
    for cur in ('USD', 'EUR', 'GBP'):
        data.append(await get_rate(cur))
    usd, eur, gbp = data
    vk_message = (f"1 Доллар = {usd} руб.\n"
                  f"1 Евро = {eur} руб.\n"
                  f"1 Фунт = {gbp} руб\n")
    await msg.answer(vk_message)