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))
|
|||
|
|