Daniel Skýpala
1 year ago
2 changed files with 90 additions and 0 deletions
@ -0,0 +1,89 @@ |
|||
from datetime import datetime |
|||
import discord |
|||
from discord.ext import commands |
|||
from discord.utils import get |
|||
from markdownify import markdownify |
|||
import re |
|||
from bs4 import BeautifulSoup |
|||
|
|||
from hrochobot.utils.ksp_utils import ksp_feed |
|||
import hrochobot.utils.data as data |
|||
|
|||
NEWS_JSON = "news" |
|||
|
|||
def guess_color(title): |
|||
""" |
|||
Automagically guess color of given post. |
|||
Not always reliable as all things automagic. |
|||
""" |
|||
def contains(*regexes): |
|||
return any(re.search(regex, title) for regex in regexes) |
|||
|
|||
if contains(r"(\d+)-Z(\d+)", "začátečnic", "KSP-Z"): |
|||
return discord.Color.green() |
|||
elif contains(r"(\d+)-(\d+)", "seriál", "série", "KSP-H"): |
|||
return discord.Color.blue() |
|||
else: |
|||
return discord.Color.dark_purple() |
|||
|
|||
def format_entry(entry, author=None): |
|||
content = "\n\n".join(map(lambda x: x.replace('\n', ' '), entry.summary.split("\n\n"))) |
|||
embed = discord.Embed( |
|||
title=entry.title, |
|||
url=entry.link, |
|||
description=markdownify(content, strip=["img"]), |
|||
color=guess_color(entry.title), |
|||
) |
|||
|
|||
soup = BeautifulSoup(content, 'html.parser') |
|||
img = soup.find('img') |
|||
if img: |
|||
embed.set_image(url=img['src']) |
|||
|
|||
if author: |
|||
embed.set_author(name=author) |
|||
|
|||
embed.set_thumbnail(url="https://ksp.mff.cuni.cz/img/hippo_head.png") |
|||
|
|||
date = datetime.fromisoformat(entry.published) |
|||
embed.set_footer(text=date.strftime("%-d. %-m. %Y")) |
|||
|
|||
return embed |
|||
|
|||
async def post_news(bot, guild, index): |
|||
news_json = data.load_guild_data(guild.id, NEWS_JSON) |
|||
if "news_channel" not in news_json: |
|||
return |
|||
|
|||
channel = get(guild.channels, id=news_json["news_channel"]) |
|||
feed = await ksp_feed() |
|||
return await channel.send(embed=format_entry(feed.entries[index], author=feed.feed.author)) |
|||
|
|||
|
|||
class News(commands.Cog): |
|||
def __init__(self, bot): |
|||
self.bot = bot |
|||
news = discord.SlashCommandGroup( |
|||
"news", |
|||
"Commands for management of ksp news.", |
|||
guild_only=True, |
|||
checks=[commands.has_permissions(manage_guild=True)] |
|||
) |
|||
|
|||
@news.command(description="Adds a new secret role.") |
|||
@discord.option("channel", discord.TextChannel, description="Channel for sending news.") |
|||
async def set_channel(self, ctx, channel: discord.TextChannel): |
|||
news_json = data.load_guild_data(ctx.guild.id, NEWS_JSON) |
|||
news_json["news_channel"] = channel.id |
|||
data.dump_guild_data(ctx.guild.id, NEWS_JSON, news_json) |
|||
return await ctx.respond(f"News channel set to {channel.mention}.", ephemeral=True) |
|||
|
|||
@news.command(description="Synchronize news feed.") |
|||
@discord.option("index", int, description="Send index-th most recent entry. (indexed from 0)") |
|||
async def post_news(self, ctx, index: int): |
|||
await post_news(self.bot, ctx.guild, index) |
|||
return await ctx.respond(f"News posted.", ephemeral=True) |
|||
|
|||
|
|||
def setup(bot): |
|||
bot.add_cog(News(bot)) |
Loading…
Reference in new issue