Browse Source

init commit

master
bouncepaw 4 months ago
commit
3e9aed86d0
3 changed files with 138 additions and 0 deletions
  1. +2
    -0
      .gitignore
  2. +32
    -0
      README.md
  3. +104
    -0
      main.py

+ 2
- 0
.gitignore View File

@ -0,0 +1,2 @@
__pycache__
config.py

+ 32
- 0
README.md View File

@ -0,0 +1,32 @@
# Klavawiki Notifier
Бот, который уведомляет о новых правках на [клававики](http://klavarog.tk) в дискорд-сервер. По идее сработает для любой вики на MycorrhizaWiki.
## Установка
Вам нужно установить модули `feedparser` и `discord`. Бог вам в помощь, у меня никогда с первой попытки не получалось.
Также склонируйте этот репозиторий куда-нибудь.
## Настройка
Создайте в папке с ботом файл `config.py`. Он будет игнорироваться гитом. У него должно быть такое содержание:
```python
settings = {
'token': 'токен бота',
'bot': 'название вашего бота в чате',
'id': айдишник числом,
'path_for_saving_hash': 'путь к файлу, в котором лежит хеш последней правки'
}
```
Также убедитесь, что файл по указанному пути существует. Запишите туда какой-нибудь хеш относительно недавний. На странице последних правок все хеши видны.
## Запуск
Запустить бота в текущем шелле:
```bash
python3 main.py
```
Запустить бота так, чтобы логи писались не в `stdout`, а в указанный путь, и бот работал в фоне даже после завершения шелла:
```
nohup python3 main.py > logfile &
```

+ 104
- 0
main.py View File

@ -0,0 +1,104 @@
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'])

Loading…
Cancel
Save