180 lines
6.1 KiB
Python
180 lines
6.1 KiB
Python
import discord
|
|
import sqlite3
|
|
import romkan
|
|
|
|
from discord import app_commands
|
|
from discord.ext import commands
|
|
|
|
class Group(app_commands.Group):
|
|
def __init__(self, db, name):
|
|
self.db = db
|
|
super().__init__(name=name)
|
|
|
|
def flot_parser(self, string: str) -> str:
|
|
output = ""
|
|
counter = 1
|
|
|
|
# for marpheme in string:
|
|
# if len(marpheme) == 0:
|
|
# continue
|
|
# elif marpheme[0] == '$':
|
|
# continue
|
|
# elif marpheme[0] == '&':
|
|
# output += f" {counter}. "
|
|
# counter += 1
|
|
# if len(marpheme) == 1: continue
|
|
# if marpheme[1] == '*':
|
|
# if marpheme[1:] == "3":
|
|
# output += "〜の"
|
|
# elif marpheme[0] == '@':
|
|
# if marpheme[1:] == "3":
|
|
# output += " *и и.п.*"
|
|
# elif marpheme[0] == ';':
|
|
# output += '; '
|
|
# elif marpheme[0] == ',':
|
|
# output += ', '
|
|
# else:
|
|
# output += marpheme
|
|
|
|
print(string)
|
|
i = 0
|
|
|
|
while i < len(string):
|
|
char = string[i]
|
|
if char == '&':
|
|
output += f" {counter}. "
|
|
counter += 1
|
|
elif char == ';':
|
|
output += "; "
|
|
elif char == ',':
|
|
output += ', '
|
|
elif char == '(':
|
|
output += ' ('
|
|
elif char in ('\\', '$'):
|
|
i += 1
|
|
continue
|
|
elif char == '*':
|
|
number = ''
|
|
|
|
if string[i+1] == '*':
|
|
i += 2
|
|
while string[i].isdigit():
|
|
number += string[i]
|
|
i += 1
|
|
i -= 1
|
|
if number == '2':
|
|
output += "〜のある"
|
|
else:
|
|
i += 1
|
|
while string[i].isdigit():
|
|
number += string[i]
|
|
i += 1
|
|
i -= 1
|
|
if number == '2':
|
|
output += "〜な"
|
|
elif number == "3":
|
|
output += "〜の"
|
|
elif number == '7':
|
|
output += "〜たる"
|
|
|
|
elif char == '@':
|
|
number = ''
|
|
i += 1
|
|
while string[i].isdigit():
|
|
number += string[i]
|
|
i += 1
|
|
i -= 1
|
|
print(number)
|
|
if number == "3":
|
|
output += " *и т.п.*"
|
|
|
|
else:
|
|
output += char
|
|
|
|
i += 1
|
|
|
|
|
|
return output
|
|
|
|
@app_commands.command(name="копирайты")
|
|
async def copyrights(self, inter):
|
|
await inter.response.send_message("Эта функция основана на базе "\
|
|
"данных проекта Яркси (http://yarxi.ru/)", ephemeral=True)
|
|
|
|
@app_commands.command(name="поиск_кандзи")
|
|
@app_commands.describe(kanji="Кандзи, который надо найти")
|
|
async def kanji_search(self, inter, kanji: str):
|
|
kanji = ord(kanji[0])
|
|
data = self.db.execute(f"SELECT Nomer, RusNick, Onyomi, Kunyomi, Russian FROM Kanji WHERE Uncd = {kanji}").fetchall()[0]
|
|
await inter.response.send_message(data)
|
|
|
|
@app_commands.command(name="поиск_слов")
|
|
@app_commands.rename(meaning="значение", pronounsing="произношение")
|
|
@app_commands.describe(pronounsing="ТОЛЬКО НА РОМАНДЗИ")
|
|
async def word_search(self, inter, meaning: str=None, pronounsing: str=None):
|
|
if meaning is None and pronounsing is None:
|
|
await inter.response.send_message("Нельзя просто так без всего найти слово")
|
|
return
|
|
if meaning is None:
|
|
searcher = f"{pronounsing}%"
|
|
elif pronounsing is None:
|
|
searcher = f"%{meaning}%"
|
|
predata = self.db.execute(f"SELECT K1, K2, K3, K4, Kana, Reading, Russian From Tango WHERE Russian Like '{searcher}'").fetchall()[:10]
|
|
data = []
|
|
for word in predata:
|
|
kanjis = []
|
|
kana = ""
|
|
number = ""
|
|
for K in word[:4]:
|
|
if K == 0: break
|
|
kanjis.append( chr(self.db.execute(f"SELECT Uncd FROM Kanji WHERE Nomer = {K}").fetchone()[0]) )
|
|
for char in word[4]:
|
|
if char.isdigit():
|
|
if kana != "":
|
|
number = int(number)
|
|
if kana.startswith('^'):
|
|
kana = romkan.to_katakana(kana[1:])
|
|
else:
|
|
kana = romkan.to_hiragana(kana)
|
|
kanjis.insert(number, kana)
|
|
number = kana = ""
|
|
|
|
number += char
|
|
else:
|
|
kana += char
|
|
|
|
if number != "":
|
|
number = int(number)
|
|
if kana.startswith('^'):
|
|
kana = romkan.to_katakana(kana[1:])
|
|
else:
|
|
kana = romkan.to_hiragana(kana)
|
|
kanjis.insert(number, kana)
|
|
|
|
print('!!', word[5])
|
|
data.append(f"**{''.join(kanjis)}** [{romkan.to_hiragana(word[5])}] {self.flot_parser(word[6])}")
|
|
if data:
|
|
await inter.response.send_message("\n".join(data))
|
|
else:
|
|
await inter.response.send_message("Ничего не нашла")
|
|
|
|
|
|
|
|
class Japanese(commands.Cog):
|
|
def __init__(self, bot):
|
|
self.bot = bot
|
|
|
|
async def cog_load(self):
|
|
self.sqlite_connection = sqlite3.connect('yarxi.db')
|
|
cursor = self.sqlite_connection.cursor()
|
|
self.bot.tree.add_command(Group(db=cursor, name="яп-словарь"))
|
|
|
|
async def cog_unload(self):
|
|
self.sqlite_connection.close()
|
|
self.bot.tree.remove_command("яп-ловарь")
|
|
|
|
|
|
async def setup(bot):
|
|
await bot.add_cog(Japanese(bot))
|
|
|