104 lines
3.2 KiB
Python
104 lines
3.2 KiB
Python
|
import asyncio
|
||
|
|
||
|
import redis.asyncio as aioredis
|
||
|
import logging
|
||
|
from aiogram import Bot, Dispatcher
|
||
|
from aiogram.types import Message
|
||
|
from aiogram.utils import executor
|
||
|
|
||
|
from e621 import E621
|
||
|
|
||
|
redis = aioredis.from_url('redis://localhost')
|
||
|
e621 = E621()
|
||
|
|
||
|
logging.basicConfig(level=logging.INFO)
|
||
|
bot = Bot(token='450146961:AAFqwPcXuWXaYP8j8sE_rYgp_dAsk9YWf7I')
|
||
|
dp = Dispatcher(bot)
|
||
|
|
||
|
|
||
|
async def check_updates():
|
||
|
async with redis.lock('e621:update'):
|
||
|
tag_list = [t.decode() for t in await redis.smembers('e621:subs')]
|
||
|
tags = ' '.join(f'~{tag}' for tag in tag_list)
|
||
|
posts = await e621.get_posts(tags)
|
||
|
if not posts:
|
||
|
return
|
||
|
already_sent = await redis.smismember('e621:sent', [p.id for p in posts])
|
||
|
for i in range(len(posts)):
|
||
|
if already_sent[i]:
|
||
|
continue
|
||
|
post = posts[i]
|
||
|
monitored_tags = set(post.tags.flatten()) & set(tag_list)
|
||
|
caption = f'Monitored tags: {" ".join(monitored_tags)}\n' \
|
||
|
f'Artist: {" ".join(post.tags.artist)}\n' \
|
||
|
f'Character: {" ".join(post.tags.character)}\n\n' \
|
||
|
f'https://e621.net/posts/{post.id}'
|
||
|
if post.file.ext == 'webm':
|
||
|
await bot.send_video(98934915,
|
||
|
post.file.url,
|
||
|
width=post.file.width,
|
||
|
height=post.file.height,
|
||
|
thumb=post.preview.url,
|
||
|
caption=caption)
|
||
|
else:
|
||
|
await bot.send_photo(98934915,
|
||
|
post.file.url,
|
||
|
caption=caption)
|
||
|
await redis.sadd('e621:sent', post.id)
|
||
|
|
||
|
|
||
|
@dp.message_handler(commands=['add'])
|
||
|
async def add_tag(msg: Message):
|
||
|
args = msg.get_args()
|
||
|
if not args:
|
||
|
await msg.reply('Please provide tag to subscribe to')
|
||
|
return
|
||
|
for tag in args.split():
|
||
|
await redis.sadd('e621:subs', tag)
|
||
|
await msg.reply(f'Tags {args} added')
|
||
|
|
||
|
|
||
|
@dp.message_handler(regexp=r'^\/del_\S+$')
|
||
|
async def del_tag(msg: Message):
|
||
|
args = msg.text[5:]
|
||
|
if not args:
|
||
|
await msg.reply('Please provide tag to subscribe to')
|
||
|
return
|
||
|
if ' ' in args:
|
||
|
await msg.reply('Tag should not contain spaces')
|
||
|
return
|
||
|
if not await redis.sismember('e621:subs', args):
|
||
|
await msg.reply('Tag not found')
|
||
|
return
|
||
|
await redis.srem('e621:subs', args)
|
||
|
await msg.reply(f'Tag {msg} removed')
|
||
|
|
||
|
|
||
|
@dp.message_handler(commands=['list'])
|
||
|
async def list_tags(msg: Message):
|
||
|
tags = [t.decode() for t in await redis.smembers('e621:subs')]
|
||
|
lines = []
|
||
|
for tag in tags:
|
||
|
lines.append(f'- {tag} [/del_{tag}]')
|
||
|
lines = "\n".join(lines)
|
||
|
await msg.reply(f'Monitored tags:\n\n{lines}')
|
||
|
|
||
|
|
||
|
@dp.message_handler(commands=['update'])
|
||
|
async def update(msg: Message):
|
||
|
await check_updates()
|
||
|
|
||
|
|
||
|
async def background_on_start():
|
||
|
while True:
|
||
|
await check_updates()
|
||
|
await asyncio.sleep(60)
|
||
|
|
||
|
|
||
|
async def on_bot_startup(dp: Dispatcher):
|
||
|
asyncio.create_task(background_on_start())
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
executor.start_polling(dp, on_startup=on_bot_startup)
|