概要
discord.py用のcogコードです。
main.py
からload_extension
する事を想定しています。
main.py
の作例はこちら
バージョン情報
Python 3.8.12
discord.py 2.1.0
実装される機能
TRPGセッションツールココフォリアで出力されるログを、hybridコマンドを通して古き良きどどんとふ形式のログに変換します。
どどんとふ全タブ用コンバータを通した後に文字化けしている状態を修復するhybridコマンドも同梱しています。
html_conv.py
import discord
from discord.ext import commands
import re #正規表現を扱うモジュール
import typing #typing.Optional解禁
class HTML_conv(commands.Cog, name = 'ログ変換'):
"""ココフォリア形式のログをどどんとふ形式に変換します"""
def __init__(self, bot: commands.Bot):
super().__init__()
self.bot: commands.Bot = bot
async def cog_check(self, ctx: commands.Context):
if ctx.author.bot:
return False
else:
return True
@commands.hybrid_command(name = "ココフォログ変換", aliases = ["ココフォ"])
@discord.app_commands.rename(log = "ログ")
async def log_conv(self, ctx: commands.Context, log: typing.Optional[discord.Attachment]):
"""
ココフォリア形式のログをどどんとふ形式のログに変換します
Parameters
-----------
log
htmlログを添付してください
"""
if log is None:
await ctx.send("ログが無いです", ephemeral = True)
return
if not log.content_type in 'text/html; charset=utf-8':
await ctx.send(f"これ{log.content_type}です\n文字コードUTF-8のHTMLログください", ephemeral = True)
return
data = await log.read()
data = data.decode("utf-8")
data = re.sub(r'\s+<p style="color:(?P<color>.*);">\s+<span> (?P<tab>\[.*\])</span>\s+<span>(?P<text>.*)</span> :\s+<span>\s*', r"\n\g<tab><font color='\g<color>'><b>\g<text></b>:", data)
data = re.sub(r'\s*</span>\s+</p>', r"</font><br>", data)
data = re.sub(r'(#\d+)\n', r"<br>\1", data)
data = re.sub(r'\s+<meta name="viewport" content="width=device-width, initial-scale=1.0" />', r"", data)
with open(log.filename, "w") as f:
f.write(data)
comp = discord.File(log.filename)
await ctx.send("お次はこちら\nhttp://dummy.flop.jp/trpg/conv/", file = comp, ephemeral = True)
@commands.hybrid_command(name = "ログ修復", aliases = ["整形ログ修復", "修復"])
@discord.app_commands.rename(log = "ログ")
async def log_repair(self, ctx: commands.Context, log: typing.Optional[discord.Attachment]):
"""
webで加工後のログの文字化けを修復します
Parameters
-----------
log
htmlログを添付してください
"""
if log is None:
await ctx.send("ログが無いです", ephemeral = True)
return
if not log.content_type in 'text/html; charset=utf-8':
await ctx.send(f"これ{log.content_type}です\n文字コードUTF-8のHTMLログください", ephemeral = True)
return
data = await log.read()
data = data.decode("utf-8")
data = '<!DOCTYPE html>\n<html lang="ja">\n <head>\n <meta charset="UTF-8" />' + data
fname = log.filename.replace(".html", "_rep.html")
with open(fname, "w") as f:
f.write(data)
comp = discord.File(fname)
await ctx.send("完成しました!", file = comp)
async def setup(bot: commands.Bot):
await bot.add_cog(HTML_conv(bot))