Бот для дискорд-сервера клаварога, который уведомляет о новых правках на клававики
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

104 lines
4.0 KiB

import discord
from discord.ext import commands, tasks
from config import settings
import feedparser
help = """Я верно служу людям, какой же я господин? А вот такой. Я значительно лучше вас, потому что взаимодействую с Discord API напрямую. Такова сила машины.
Я написан на Python с использованием библиотеки discord.py. Мой создатель, понятное дело, Баунс.
Я собираю правки с http://klavarog.tk и уведомляю о них людей. Обычно я это делаю раз в 10 минут, но меня можно попросить сделать это прямо сейчас, позвав меня."""
url = "http://klavarog.tk"
emoji_right = "👉"
emoji_news = "📰"
emoji_empty = "😶"
channel_to_use = None
def save_hash_as_file(hash):
f = open(settings['path_for_saving_hash'], 'w')
f.write(hash)
f.close()
def saved_hash():
try:
f = open(settings['path_for_saving_hash'], 'r')
ret = f.read()
f.close()
return ret
except:
return "7ee07bb" # hardcoded, so what?
def save_last_hash(entries):
save_hash_as_file(entries[0].id.split('/')[-1])
def keep_fresh_edits_only(feed, last_edit_hash):
fresh = []
savedh = saved_hash()
for entry in feed.entries:
if savedh in entry.id:
break
fresh.append(entry)
return fresh
def showcase_an_edit(edit):
return discord.utils.escape_markdown(emoji_right + " " + edit.title + " by " + edit.author + ": " + edit.link)
def showcase_edits(feed):
return emoji_news + " **Новые правки зa последнее время**\n" + "\n".join(reversed(list(map(showcase_an_edit, feed))))
def get_edits_summary(last_edit_hash):
print("Last remembered edit: {0}\n".format(last_edit_hash))
feed = feedparser.parse("http://klavarog.tk/recent-changes-rss")
# pprint.pprint(feed.entries)
fresh_edits = list(set(keep_fresh_edits_only(feed, last_edit_hash)))
if len(fresh_edits) == 0:
return emoji_empty + " **Нет новых правок.** Последняя: {0}".format(discord.utils.escape_markdown(feed.entries[0].title + " by " + feed.entries[0].author + ": " + feed.entries[0].link))
save_last_hash(fresh_edits)
return showcase_edits(fresh_edits)
class MyClient(discord.Client):
async def on_ready(self):
global channel_to_use
try:
klavarog = self.guilds[0]
for ch in klavarog.channels:
if ch.name == "вики":
channel_to_use = ch.id
break
finally:
self.fire.start()
print("Channel I'm going to operate in: {0}".format(channel_to_use))
print("Logged on as {0}. Ready to serve!".format(self.user))
async def on_message(self, message):
global remembered_hash
global channel_to_use
msgtxt = message.content
ch = message.channel
if ch.name != "вики":
return
print('Message from {0.author} at {0.id}: {0.content}'.format(message))
if msgtxt.lower().startswith('господин нотифаер!'):
await ch.send('Это я.')
elif msgtxt.lower().startswith('господин нотифаер, правки!') or (self.user in message.mentions):
await ch.send(get_edits_summary(saved_hash()))
elif msgtxt.lower().startswith('господин нотифаер, расскажите о себе'):
await ch.send(help)
@tasks.loop(seconds=600)
async def fire(self):
global channel_to_use
print("Fire!")
ch = self.get_channel(channel_to_use)
msgtxt = get_edits_summary(saved_hash())
if "Нет новых правок" not in msgtxt:
print(msgtxt)
await ch.send(msgtxt)
if __name__ == "__main__":
print("Starting...")
client = MyClient()
client.run(settings['token'])