diff --git a/.gitignore b/.gitignore index 22d3516..e8f034f 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,4 @@ Cargo.lock # These are backup files generated by rustfmt **/*.rs.bk - -# Added by cargo - -/target +.env \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml index 1ccd35c..a68ee51 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,3 +6,17 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +dotenv = "0.15.0" +rand = "0.8.5" +tracing = "0.1.30" +tracing-subscriber = "0.3.8" +serde_json = "1.0.79" +reqwest = "0.11.9" + +[dependencies.tokio] +version = "1.0" +features = ["macros", "signal", "rt-multi-thread"] + +[dependencies.serenity] +version = "0.10.10" +features = ["cache", "framework", "standard_framework", "rustls_backend"] \ No newline at end of file diff --git a/kanji_lists.json b/kanji_lists.json new file mode 100644 index 0000000..877505b --- /dev/null +++ b/kanji_lists.json @@ -0,0 +1,111 @@ +{ + "JOYO": { + "description": "Set of general use kanji taught at Japanese schools.", + "default": "HEISEI22", + "versions": { + "HEISEI22": { + "characters": "矢王穀胃長班典将考栄畑単輸福役修障捨行固格面権参草臓練額専労純吸貿台的居導火塩係要宮階対服並積源神炭待妻批波里応今無得舎部実着観署翌識就北鼻置県仏城領熟仕苦税仮成婦羽投飼委上供落気白持窓頂盛指政茶族意職病阪円評刊訓薬芽告客低証章原石史故力都州兆賛町弁段移飲業働関性若版協帳奏記作湖機辞効険比縦模存勤題梅銭東集地箱静毛康逆志晴馬列側説二縄編育数覧紅改穴旅善農宗種節具代橋売急先潟頭序井複風覚型氷港臨欲回童希絹尺票特物熱操密声順録築派泣臣速阜相庫老禁砂郷冷預糸優当決鳥向授裁様究営痛終腸警案場誕処絵食聖追登染確測生商別包検裏張願七去利画負容身綿児反蒸花線美司現夏拡景歴寸温構発管計岐料冊四古何求済象常刻竹統才安徳根雨囲銀員慣野益蔵装会習松始真前知九局差復校残皇写秋支精賃旗賞防垂万針午達十付非秘央出崎岡降再訪用答忘郵陽最仁油副手明欠広例夕罪造往后動泉岩者田兄未接科収滋難目片価祭総浴定池経岸書奈貧細印各黄秒敵境工軽木柱佐不太研盟内補少械詞強刀制類乳困推救走英同規師世果全雪完簡庁肥語昔沖流旧死鏡戦乱好帰億引樹在度宙鉱庭験訳絶便割誠断学公句机拾護縮冬探孫灯蚕均正八則忠程脳信養赤灰話百器余耳功毒折傷鹿駅賀勝律両誌毎足下私朝棒子半重己船背魚算道漁千麦納幸談資陸採館令読隊技牛勇独官潔栃混週留径亡青芸厚条谷害金増伝国教文川男後高笑底夫閉暖父布門合件失射埼植春路報像問満区異取悲海式宝展小敬健遺買誤招天粉墓五否努六貨界革紀株視周卵角因貸皮茨元放準仲礼財謝分量術停店圧心湯親位西質休際遠良弟妹初顔末歌紙党悪許媛愛略浅巣義担候策肉葉快巻唱照層医興責犬坂緑揮園平宣南曲以衣借災殺暴任夜治沿域人昭山泳課喜情深奮退争横息短想名番羊月述共認打熊倉素値恩諸戸受危能結変迷主止夢脈俳券三京女閣胸届状豆宅骨左品織開看理外期富席幹寺競街守組感判兵然宇費整球早和姉思一電菜干厳社減多博言群返曜刷府銅枚空設犯武入切黒通年友永時貴星団飛省札調等所眼著寄貯聞申給氏丁査弱運丸住焼念姿車試論属枝洗延勉士率祖活送虫中皿河消玉板耕新近血酒表俵筆拝提音使形次創漢材有肺軍潮鉄昼色昨酸汽舌筋暮幕演事散加呼水字衆選鋼立見討映磁績久憲極詩産帯乗村必間寒第燃遊郡右光直起続基倍講君破製勢来座級土朗察暑衛首笛建望卒林飯疑可洋牧保陛損点配森弓由号約連味方腹香母荷解化徒液辺鳴交束他楽清系転暗島態雲豊日助祝従口似至示劇標除注貝孝尊図命歯備糖航易挙我桜過晩承法輪堂幼激個自雑敗限宿家室民適大歩院屋体季務議進本予米梨市握扱依威偉為違緯維壱芋隠陰鋭影越援縁煙鉛汚押奥憶菓箇暇雅介壊戒皆較獲刈甘監汗歓勧乾鑑環含奇鬼祈輝幾儀戯詰脚却丘及朽拠巨距御驚凶恐響叫狭狂況仰駆屈掘繰傾恵迎撃肩堅遣兼軒圏剣玄誇鼓枯継互更荒抗攻稿香恒項豪込婚鎖歳彩載剤咲惨雌伺紫刺脂旨執芝煮斜釈寂狩朱趣需秀舟襲柔獣瞬巡旬盾紹召沼詳床称畳丈飾殖触浸震慎侵寝振薪陣尽尋吹是征姓井跡扇占鮮訴燥騒僧贈即俗耐替拓沢濁脱丹端嘆淡弾恥遅致蓄沖跳徴澄珍沈抵堤摘滴添殿途吐渡奴怒透唐桃盗塔到倒逃踏稲闘胴峠突鈍曇弐悩濃輩杯泊拍迫薄爆髪抜罰繁販搬範般盤被疲彼避尾微匹描浜敏怖膚浮腐敷普賦舞幅払噴柄壁捕舗峰抱砲肪坊忙冒傍帽凡盆漫慢妙眠矛霧娘茂網猛黙紋踊雄与誉腰溶躍謡翼雷頼絡欄離粒慮療隣涙隷麗齢暦劣烈恋露郎惑腕哀慰詠悦閲炎宴欧殴乙卸穏架佳華嫁餓怪悔塊概慨該穫隔郭岳掛滑勘肝貫敢緩冠換喚企軌棄棋忌既岐騎犠欺菊吉喫虐虚脅峡凝緊斤愚偶遇啓鶏携掲刑憩契鯨賢倹幻雇顧弧孤悟娯甲孔控拘郊硬綱巧坑慌絞酵克獄魂紺恨墾催債削錯搾撮擦暫施祉諮侍慈軸湿疾赦邪殊寿潤遵徐如晶掌鐘焦衝昇匠譲錠嬢冗嘱辱審伸辛粋炊遂衰穂酔随髄瀬牲婿請隻惜斥籍摂潜繕措阻粗礎双桑葬掃遭憎促賊逮胎怠滞袋滝託卓択諾奪胆鍛壇稚畜窒駐抽鋳彫超聴陳鎮墜訂帝締哲斗塗陶凍痘匿篤豚尿粘婆排陪縛伐帆伴藩畔蛮泌卑碑姫漂苗赴符封伏覆墳紛癖募慕簿崩芳胞縫倣邦飽奉妨乏謀膨房某墨没翻魔埋膜又魅滅免幽憂誘擁揚揺抑裸濫吏隆了猟陵糧厘零霊励裂錬廉炉漏廊浪楼湾亜尉逸韻姻疫謁猿凹翁虞稼寡禍渦靴蚊拐懐涯劾垣核殻嚇潟喝渇褐轄括且患缶棺陥堪款還艦閑寛憾頑飢偽擬宜糾窮拒挟享矯恭暁菌謹琴襟吟隅薫勲蛍茎渓慶傑嫌謙献顕懸繭弦呉碁購肯洪江貢衡侯溝剛拷酷昆懇佐詐唆栽砕宰斎崎酢索桟傘賜嗣肢滋璽漆遮蛇酌爵珠儒臭囚醜酬愁銃渋充汁粛淑叔塾俊准循殉庶緒叙渉祥升硝尚肖償抄奨彰症宵粧礁訟詔剰浄壌醸縄娠津紳診唇刃迅甚睡帥枢崇据杉畝斉誓逝析窃拙栓薦仙繊践旋遷禅漸疎租塑捜壮荘藻喪霜挿槽曹駄妥堕惰泰濯但棚痴逐秩嫡衷挑眺弔懲釣勅朕塚漬坪邸亭艇呈廷偵貞逓泥徹撤迭搭筒悼棟騰謄洞督凸屯軟尼忍妊寧把覇廃培賠媒伯舶漠肌鉢閥煩頒披扉妃罷猫頻賓瓶譜扶附侮沸雰憤幣弊塀併丙偏遍浦褒泡俸剖紡僕撲朴堀奔摩磨麻抹岬銘盲耗妄厄癒諭愉唯悠裕融猶窯庸羅酪履痢柳竜硫虜寮僚涼倫累塁鈴戻賄枠挨曖宛嵐畏萎椅彙茨咽淫唄鬱怨媛艶旺岡臆俺苛牙瓦楷潰諧崖蓋骸柿顎葛釜鎌韓玩伎亀毀畿臼嗅巾僅錦惧串窟熊詣憬稽隙桁拳鍵舷股虎錮勾梗喉乞傲駒頃痕沙挫采塞埼柵刹拶斬恣摯餌鹿叱嫉腫呪袖羞蹴憧拭尻芯腎須裾凄醒脊戚煎羨腺詮箋膳狙遡曽爽痩踪捉遜汰唾堆戴誰旦綻緻酎貼嘲捗椎爪鶴諦溺塡妬賭藤瞳栃頓貪丼那奈梨謎鍋匂虹捻罵剝箸氾汎阪斑眉膝肘阜訃蔽餅璧蔑哺蜂貌頬睦勃昧枕蜜冥麺冶弥闇喩湧妖瘍沃拉辣藍璃慄侶瞭瑠呂賂弄籠麓脇" + }, + "SHOWA56": { + "characters": "判票領偽秀息礼閑霜七僚材拘覧大覚声楽渉巻促枢就派暇廷篤剛幼挙等慨電脅実徳程繁弁襲抹不果潔了泳六星残釈狂撃得寄壱型彼競懲焦苦別娠秒騰号粗陽訓字悪柄仕分沼詐飲巡婦俗告盟識設偉汚類独崩牛為間予批紫看絹糖飢願寺体慌離澄絵勤寂准岐有失傷稿伺験剰盲洗端悩郎蚊父伴刻馬糧夏塩情硫画天衆稚気各雨圏揮搾液滋都咲故漁委義研似草患珠含迭欠万尽報熟混事犯暫志錘産指微減積青泡日壊丈遵権醸念燥疫貴尋匠本岬参胴欧雄震痛国鎮近酸閲挟航宵違踊預臓衰濯舎睡酪履働湾朴棚末悼涼茂黙恋地抜簿棟劇前貯戻化茶遮未妻久険母析会潮紅覆担舌旧士種汁戸板蛮桟択風桑媒砕糾陥値悟朗余図覇林尼博目鎖笛釣次頂宗隊消支殴累純福譜折嫌濁猛面衷頒静筋破峠郭角賠免理刑九給束炊沈思膨適愁臭納豪平桜筒内欲峰惨婆兆商昇改瞬副全伯隣取浮又腐救庭塁聴浸上矢洋滅切瓶紺褐栽決敏整響凍今放疾及凹悠柱濃柳誕厚淡把奉物男潜尿防乳株忙広抄郊偏亭数視肖吹松社慮靴提臣殿動眺鐘煙頻発短譲保穀長堕盗四膜宣除仙如速包遊幾欺開彩畑捜霊波版壮敢個像蛍行垂牲克栄複抱己降僕承憂刊丙怠禍飯過諾特偵虐眠倉考秩狩璽結院齢美惰阻佐儒幸尾械勅弔来売県人布井刷斜雅益駆令群逓菓貢友導乏少賊格常以円退拒極飽要隠黒建植漂革甘揚怪孫隷優収符応是騎際虚絞炉里達戦倒頼期低漠侍医中鍛蓄丁計船勢墓穂胃診妙猟方扇雷顧虫金惑謝州殖典呉財著突賦崎暴脱絡客約恩暖肉望謄検繕割姓砂憤冗麻詩漏竹帯喜践升幹鉱一卸剤燃擦旬君冊装灰渇紛牧木栓隆絶軽奴距相逆彫横侮懸呼規健銃宿正肪鳴系傍乱宰畜髪労池夜還陳庸協妹援疑練賃境抗枠難芸創房振業鮮費鏡渓据丸税斗当堤黄深森施階主鈴私銀吟顔娘閥庁香算薄市郵侯充雲漢箇測曲古奪江愉巨泥舞醜固雰言踏項供匹酷喝致身認魂裂凝屈川惜英厄位倫他均農並休史使憾斎滞拓潤忠辞銅級泰辺唆術拐吐蔵兵妊祈知経衝恐水緯斥法附般春圧銘道隅多盤廃嘱教扉坂坊追満高拙選立記霧捕甚薦互議証貸届賞仏梅製第揺販康酢刃績徐循接凸必城侵炭迷輸案魚補某往漬没賢血晶枝挑麦拝措箱棒早米樹顕洪悔貨曇撮寝祉億謡享怒藻走公門徒窯急泊膚辛浅状食押順増匁恭張容合詔泣去卵禁穴握石浦需昨誉昼守神置五出陸冷憩書粒聞猿雇送可差性館詞妄搬謀畔心枚珍勇叙京盛住舗足薪解渋便胸形衛攻準刈管跡寡被託示軌策枯淑懇登月祥遂薬講剖隔備繭障秋腹皿歌慢命涙芳名耕象岸逃舟幅喪交崇越週若調華良綿仁涯掘坪亜仰帆披団養培光慶紙暮紹係蛇賀進態羽域洞暑閉素量件孤列用護育才討腕御迅断反逐称葉帳花憎遷砲弦塑基南摘訂獣毛歩徹底籍帝拾腰酌影塚触究氷推溝溶統訳玄濫探密裕者留倹奇遅孔利窓寮寒鑑環由氏旅豚界騒封緩倣礁壁輝二季点否塗赦造制課娯縮賄器皆成謹染見質卓児延錯辱清番稲苗弓魅后沿畳邸投湯式津迫官百夢吏替到時灯僧郷傑線悦引治缶祭胆印停冒艇机奥渡豆座戯操剣朝節宝陰焼湿錬初征疎猶盾機仮腸桃謁映感毎尚貝窒描演欄伸例太獲喚尊求巧弾携庶軟敷勺誤能赴凶執陣殺貫糸噴察軸屋元署片翼属愛稼酒痘傾諸十卑存荘緒恥北句希職肺威弐死掛胎胞朽関脳飾愚路疲功軒挿八塔千慣歴府務賛暗班誇貿輪配確世穫諮爆核共徴駄掲老啓対豊購叔撤変吸掃緊文褒帰助談宴罷勲縛乾済菜依趣肯鉛飼穏寧縦魔跳暁茎鳥畝壇展訟旗再力礎陵町督債自陶呈但品模姫劾諭肌採好則区孝症序場許空話連脹何定鉄妨口精我所伝冬誌企菊浄囚処懐狭干粧和擁却作俊捨殉炎頭且径乙宅垣彰率聖海鈍煩臨邪双監慰任工舶表柔民祝婿嫁半球在景曜瀬段夫甲童雑恵価従汗叫加犬居堂政室粘占槽湖橋沖帽餓科射即勉宜党烈審卒最扱車宇恨袋災札拷窮夕集傘鋭細様秘善薫始想翁脚略犠堅兼弟勘続寿酔持罰矛荒亡罪永銑困偶筆晩丘照厘囲原冠忍融唐買堪契坑専温題途透網券尺幽髄妃勝強止楼銭刺省韻借田哲陪運曹意帥軍租範招店戒貧邦修回癒羅巣易爵斉限壌嬢料怖丹憶述王刀慕暦散抵無宙渦滝至遍席条笑紀拍吉針昆完排録与央墨具赤岩西遺款奮詠評左歳年訴概贈献唇沸校異寛紡真衣詳払授背峡毒翻眼載拡姿重嘆明荷伐倍墳山雪嚇屯皮司注嗣逝幻既敬締飛迎棄同廊鬼親鯨芝両召味併驚療右慈架負索婚流庫貞痢沢煮菌賜匿観肢将掌試請復姻盆繰藩忌損蚕杉憲翌唱織誘入紋緑佳恒家読島錠募控代綱露耗縫肝営員凡玉終肩遣碑色通誓羊酬伏晴安頑浴輩汽雌移鉢構耳河査候摂励先非厳武介小芋技根普源兄骨脈首三硬油朕摩維更標裁効墜勧白病竜打火鼻野皇谷賓潟虞泉村向後快猫慎的扶築哀抽富習衡誠責劣妥港歯謙逸奏付撲襟信音喫痴唯縁詰嫡宮弱姉写窃危添逮警艦廉生簡服族土磁墾昔儀章滴弊午論熱浪殊裏鶏床遭敵律額抑琴獄台酵落継紳硝零外返敗度禅繊鋳塾旋堀問避奨手弧駐新比待耐側粋脂遠周随括資層況申粛催虜乗答着斤園芽裸下擬単込起葬寸編鼓岳説朱鋼幣興転棺縄悲女杯棋肥俸俳子因幕祖塀努総磨搭忘隻殻語現麗超漫駅該旨換矯局拠師役俵陛塊漆歓尉蒸削閣闘浜受然躍争埋部直害轄訪学組較東粉滑活償泌街碁奔癖遇激郡昭漸仲" + } + } + }, + "JINMEIYO": { + "description": "Set of kanji not in the Joyo list that can be used in personal names in Japan.", + "default": "HEISEI29", + "versions": { + "HEISEI29": { + "source": "https://ja.wikipedia.org/wiki/人名用漢字", + "characters": "摑壽亥盃稜輔茉駕櫓雀叡徠椋栖渚漢陀之榊聡錘瑛槇盡謂卷禾寓甫廿魯杖庇琳社祉釘蟹迪稀鷗燦豹芭按幡堵喧歎狹猪雫圓亦奎沫伶梯粟祕橫廳犀嶋祿灼智琉丑氣乘萠撰讓矩惡廊彗輯龍祖蒔洵篠或兎珊纏峽疏柊駈耽楠昴鎭讃禎濕悌禎洸擢伊樋允鷹撫藥晏壘都脩詫籾俱栞祐醍沓帶斐篇鋒湘薰庵賴鷺茅玖雛眞浬彌儲拜煤楚弛菅晚榮葺怜晟條晦碓宋蒙騷懲穗窺險歷勤收秤蠟凱卿與娃恢雁辰遙鷄鑄巢毅凪禽曙鳩煌祇訣燿倦粥縣淀迄閃卽綠謁卑轉胤疊侃檎鞭紘棲瑶鳳窪麟頗圃暑擊驗拂彪澁槍馴孃杏劫麿揃爾凰湊斯磯萩渚硯也竺卜叶飜陷枇董捺杭剩柏溜晝魁髮套墨隈舜澪桐覽厨蕎黃荻藝祷穿臭菩徽狀楢黑裳紐瀨碑綾鋸巴楯顯椰椿逗圈嶺姥欽翔郞榛珈稔燕簾禪熙仔從芹琶緣戲汐者裡肇牽惇侮寬瑚叢蔦尭迦桶諺蒐惹噌捲蟬鞠臥穹茸牡蕨柾萊哉賓燒價帖緖祥搜嘗尖賑憎梓釧錐葡灘虜甥菫碩洛俣焰衞莊壕類悉紗綜峯嚴繡薙苔於桂焚只鯉椛每曉桧恰詢樟肋凉禱汀壬悔衿夷藁崚欄昏斧碗殆毬凧鍬杜瓜峻椀坦巌淋托繫兒萱醉柑渥巽瀕奬鎧竣冴團逢器鞄蝦莉鵜嘉贈鷲恕塙欣櫛僞祢掬絢薗曝懷吻葵增晃蓮笈練桔瀧匡娩將鱒禍駿惚釉徵乎溢嘩柴朗琢獅凜胡步簞瓢釀菱喬楓晋禮應馨單喰笠柚默啄實錄畢遥竿腔尤曆橙勳禄薩倖筑乃庚祐碧竪寢醐亘燎俄佃戟漕蓬莫蔣鮎謠阿勿祁兜槻磐廟遼樽雜耶戊奄淚鞘宕海穰漱糊峨哨蔭梅署勉叉嬉檀郁珂玲萬纂諒庄毘彬牒愼碎洲燭緋惺敍蕪頁箕奧笹傭誼鴨齊穀槌猪註茜裟昊德憐吾菖琢綸嘆閏鍊臟黛櫂鴻羚撒楊佛拔惟坐些眸黎涉敏梛宏醇姪馳縞亨慧諸戰侑凛巳堰亙迂函訊此鳶節晒鼎瑳琵箔耀樣縱惣而苑暢巫翠厩來祈檜蓉惠彈辿錫摺捧朋槙播渴儉蹟樫鰯跨淵芥鄭茄梶逸埴樺芙著芦燈寵謹鯛逞嵩彦疋榎響纖筈浩遁栗灸斡繁輿辻忽驍梁砧蝶麒蘭隼袈袴爲旭稟紬劉吞撞伽其鞍宥朔綺樂秦瘦蓑李祝蕉赳邑敦巷神笙佑挽掠喋窄葦僧俠幌賣匁橘凌蹄冨牟沌屑捷淳閤襖丞珀云莞琥柘晄淨櫻頌這粹噂蕗哩滉狼杷倭湛瞥蕃埜層穣難廻揭梧絆曳攝勺瑞砦弘卯巖孟俐晨脹偲劍酉楕獸顚壯亮苺皓視轟勁禰汝曾暉醬渾靜專貰蒼鱗寅裝傳虛搖膏蘇蔓靖烏綴滯盜蒲濡煮螺嵯稻霞饗畠藏梢杵恆汲圭諏廣錆皐煉檢挺昌聽堺溫昂肴國漣福壞已舵諄亞絃萌爭堯銑伍蕾鵬突颯砥孜萄" + }, + "HEISEI27": { + "source": "https://ja.wikipedia.org/wiki/人名用漢字", + "characters": "摑壽亥盃稜輔茉駕櫓雀叡徠椋栖渚漢陀之榊聡錘瑛槇盡謂卷禾寓甫廿魯杖庇琳社祉釘蟹迪稀鷗燦豹芭按幡堵喧歎狹猪雫圓亦奎沫伶梯粟祕橫廳犀嶋祿灼智琉丑氣乘萠撰讓矩惡廊彗輯龍祖蒔洵篠或兎珊纏峽疏柊駈耽楠昴鎭讃禎濕悌禎洸擢伊樋允鷹撫藥晏壘都脩詫籾俱栞祐醍沓帶斐篇鋒湘薰庵賴鷺茅玖雛眞浬彌儲拜煤楚弛菅晚榮葺怜晟條晦碓宋蒙騷懲穗窺險歷勤收秤蠟凱卿與娃恢雁辰遙鷄鑄巢毅凪禽曙鳩煌祇訣燿倦粥縣淀迄閃卽綠謁卑轉胤疊侃檎鞭紘棲瑶鳳窪麟頗圃暑擊驗拂彪澁槍馴孃杏劫麿揃爾凰湊斯磯萩渚硯也竺卜叶飜陷枇董捺杭剩柏溜晝魁髮套墨隈舜澪桐覽厨蕎黃荻藝祷穿臭菩徽狀楢黑裳紐瀨碑綾鋸巴楯顯椰椿逗圈嶺姥欽翔郞榛珈稔燕簾禪熙仔從芹琶緣戲汐者裡肇牽惇侮寬瑚叢蔦尭迦桶諺蒐惹噌捲蟬鞠臥穹茸牡蕨柾萊哉賓燒價帖緖祥搜嘗尖賑憎梓釧錐葡灘虜甥菫碩洛俣焰衞莊壕類悉紗綜峯嚴繡薙苔於桂焚只鯉椛每曉桧恰詢樟肋凉禱汀壬悔衿夷藁崚欄昏斧碗殆毬凧鍬杜瓜峻椀坦巌淋托繫兒萱醉柑渥巽瀕奬鎧竣冴團逢器鞄蝦莉鵜嘉贈鷲恕塙欣櫛僞祢掬絢薗曝懷吻葵增晃蓮笈練桔瀧匡娩將鱒禍駿惚釉徵乎溢嘩柴朗琢獅凜胡步簞瓢釀菱喬楓晋禮應馨單喰笠柚默啄實錄畢遥竿腔尤曆橙勳禄薩倖筑乃庚祐碧竪寢醐亘燎俄佃戟漕蓬莫蔣鮎謠阿勿祁兜槻磐廟遼樽雜耶戊奄淚鞘宕海穰漱糊峨哨蔭梅署勉叉嬉檀郁珂玲萬纂諒庄毘彬牒愼碎洲燭緋惺敍蕪頁箕奧笹傭誼鴨齊穀槌猪註茜裟昊德憐吾菖琢綸嘆閏鍊臟黛櫂鴻羚撒楊佛拔惟坐些眸黎涉敏梛宏醇姪馳縞亨慧諸戰侑凛巳堰亙迂函訊此鳶節晒鼎瑳琵箔耀樣縱惣而苑暢巫翠厩來祈檜蓉惠彈辿錫摺捧朋槙播渴儉蹟樫鰯跨淵芥鄭茄梶逸埴樺芙著芦燈寵謹鯛逞嵩彦疋榎響纖筈浩遁栗灸斡繁輿辻忽驍梁砧蝶麒蘭隼袈袴爲旭稟紬劉吞撞伽其鞍宥朔綺樂秦瘦蓑李祝蕉赳邑敦巷神笙佑挽掠喋窄葦僧俠幌賣匁橘凌蹄冨牟沌屑捷淳閤襖丞珀云莞琥柘晄淨櫻頌這粹噂蕗哩滉狼杷倭湛瞥蕃埜層穣難廻揭梧絆曳攝勺瑞砦弘卯巖孟俐晨脹偲劍酉楕獸顚壯亮苺皓視轟勁禰汝曾暉醬靜專貰蒼鱗寅裝傳虛搖膏蘇蔓靖烏綴滯盜蒲濡煮螺嵯稻霞饗畠藏梢杵恆汲圭諏廣錆皐煉檢挺昌聽堺溫昂肴國漣福壞已舵諄亞絃萌爭堯銑伍蕾鵬突颯砥孜萄" + }, + "HEISEI25": { + "source": "https://ja.wikipedia.org/wiki/人名用漢字", + "characters": "摑壽亥盃稜輔茉駕櫓雀叡徠椋栖渚漢陀之榊聡錘瑛槇盡謂卷禾寓甫廿魯杖庇琳社祉釘蟹迪稀鷗燦豹芭按幡堵喧歎狹猪雫圓亦奎沫伶梯粟祕橫廳犀嶋祿灼智琉丑氣乘萠撰讓矩惡廊彗輯龍祖蒔洵篠或兎珊纏峽疏柊駈耽楠昴鎭讃禎濕悌禎洸擢伊樋允鷹撫藥晏壘都脩詫籾俱栞祐醍沓帶斐篇鋒湘薰庵賴鷺茅玖雛眞浬彌儲拜煤楚弛菅晚榮葺怜晟條晦碓宋蒙騷懲穗窺險歷勤收秤蠟凱卿與娃恢雁辰遙鷄鑄巢毅凪禽曙鳩煌祇訣燿倦粥縣淀迄閃卽綠謁卑轉胤疊侃檎鞭紘棲瑶鳳窪麟頗圃暑擊驗拂彪澁槍馴孃杏劫麿揃爾凰湊斯磯萩渚硯也竺卜叶飜陷枇董捺杭剩柏溜晝魁髮套墨隈舜澪桐覽厨蕎黃荻藝祷穿臭菩徽狀楢黑裳紐瀨碑綾鋸巴楯顯椰椿逗圈嶺姥欽翔郞榛珈稔燕簾禪熙仔從芹琶緣戲汐者裡肇牽惇侮寬瑚叢蔦尭迦桶諺蒐惹噌捲蟬鞠臥穹茸牡蕨柾萊哉賓燒價帖緖祥搜嘗尖賑憎梓釧錐葡灘虜甥菫碩洛俣焰衞莊壕類悉紗綜峯嚴繡薙苔於桂焚只鯉椛每曉桧恰詢樟肋凉禱汀壬悔衿夷藁崚欄昏斧碗殆毬凧鍬杜瓜峻椀坦巌淋托繫兒萱醉柑渥巽瀕奬鎧竣冴團逢器鞄蝦莉鵜嘉贈鷲恕塙欣櫛僞祢掬絢薗曝懷吻葵增晃蓮笈練桔瀧匡娩將鱒禍駿惚釉徵乎溢嘩柴朗琢獅凜胡步簞瓢釀菱喬楓晋禮應馨單喰笠柚默啄實錄畢遥竿腔尤曆橙勳禄薩倖筑乃庚祐碧竪寢醐亘燎俄佃戟漕蓬莫蔣鮎謠阿勿祁兜槻磐廟遼樽雜耶戊奄淚鞘宕海穰漱糊峨哨蔭梅署勉叉嬉檀郁珂玲萬纂諒庄毘彬牒愼碎洲燭緋惺敍蕪頁箕奧笹傭誼鴨齊穀槌猪註茜裟昊德憐吾菖琢綸嘆閏鍊臟黛櫂鴻羚撒楊佛拔惟坐些眸黎涉敏梛宏醇姪馳縞亨慧諸戰侑凛巳堰亙迂函訊此鳶節晒鼎瑳琵箔耀樣縱惣而苑暢翠厩來祈檜蓉惠彈辿錫摺捧朋槙播渴儉蹟樫鰯跨淵芥鄭茄梶逸埴樺芙著芦燈寵謹鯛逞嵩彦疋榎響纖筈浩遁栗灸斡繁輿辻忽驍梁砧蝶麒蘭隼袈袴爲旭稟紬劉吞撞伽其鞍宥朔綺樂秦瘦蓑李祝蕉赳邑敦巷神笙佑挽掠喋窄葦僧俠幌賣匁橘凌蹄冨牟沌屑捷淳閤襖丞珀云莞琥柘晄淨櫻頌這粹噂蕗哩滉狼杷倭湛瞥蕃埜層穣難廻揭梧絆曳攝勺瑞砦弘卯巖孟俐晨脹偲劍酉楕獸顚壯亮苺皓視轟勁禰汝曾暉醬靜專貰蒼鱗寅裝傳虛搖膏蘇蔓靖烏綴滯盜蒲濡煮螺嵯稻霞饗畠藏梢杵恆汲圭諏廣錆皐煉檢挺昌聽堺溫昂肴國漣福壞已舵諄亞絃萌爭堯銑伍蕾鵬突颯砥孜萄" + } + } + }, + "KYOIKU": { + "description": "Set of kanji taught at Japanese elementary schools.", + "default": "REIWA2", + "versions": { + "REIWA2": { + "source": "http://www.mext.go.jp/component/a_menu/education/micro_detail/__icsFiles/afieldfile/2017/05/12/1384661_4_2.pdf", + "characters": { + "GRADE1": "一右雨円王音下火花貝学気九休玉金空月犬見五口校左三山子四糸字耳七車手十出女小上森人水正生青夕石赤千川先早草足村大男竹中虫町天田土二日入年白八百文木本名目立力林六", + "GRADE2": "引羽雲園遠何科夏家歌画回会海絵外角楽活間丸岩顔汽記帰弓牛魚京強教近兄形計元言原戸古午後語工公広交光考行高黄合谷国黒今才細作算止市矢姉思紙寺自時室社弱首秋週春書少場色食心新親図数西声星晴切雪船線前組走多太体台地池知茶昼長鳥朝直通弟店点電刀冬当東答頭同道読内南肉馬売買麦半番父風分聞米歩母方北毎妹万明鳴毛門夜野友用曜来里理話", + "GRADE3": "悪安暗医委意育員院飲運泳駅央横屋温化荷界開階寒感漢館岸起期客究急級宮球去橋業曲局銀区苦具君係軽血決研県庫湖向幸港号根祭皿仕死使始指歯詩次事持式実写者主守取酒受州拾終習集住重宿所暑助昭消商章勝乗植申身神真深進世整昔全相送想息速族他打対待代第題炭短談着注柱丁帳調追定庭笛鉄転都度投豆島湯登等動童農波配倍箱畑発反坂板皮悲美鼻筆氷表秒病品負部服福物平返勉放味命面問役薬由油有遊予羊洋葉陽様落流旅両緑礼列練路和", + "GRADE4": "愛案以衣位茨印英栄媛塩岡億加果貨課芽賀改械害街各覚潟完官管関観願岐希季旗器機議求泣給挙漁共協鏡競極熊訓軍郡群径景芸欠結建健験固功好香候康佐差菜最埼材崎昨札刷察参産散残氏司試児治滋辞鹿失借種周祝順初松笑唱焼照城縄臣信井成省清静席積折節説浅戦選然争倉巣束側続卒孫帯隊達単置仲沖兆低底的典伝徒努灯働特徳栃奈梨熱念敗梅博阪飯飛必票標不夫付府阜富副兵別辺変便包法望牧末満未民無約勇要養浴利陸良料量輪類令冷例連老労録", + "GRADE5": "圧囲移因永営衛易益液演応往桜可仮価河過快解格確額刊幹慣眼紀基寄規喜技義逆久旧救居許境均禁句型経潔件険検限現減故個護効厚耕航鉱構興講告混査再災妻採際在財罪殺雑酸賛士支史志枝師資飼示似識質舎謝授修述術準序招証象賞条状常情織職制性政勢精製税責績接設絶祖素総造像増則測属率損貸態団断築貯張停提程適統堂銅導得毒独任燃能破犯判版比肥非費備評貧布婦武復複仏粉編弁保墓報豊防貿暴脈務夢迷綿輸余容略留領歴", + "GRADE6": "胃異遺域宇映延沿恩我灰拡革閣割株干巻看簡危机揮貴疑吸供胸郷勤筋系敬警劇激穴券絹権憲源厳己呼誤后孝皇紅降鋼刻穀骨困砂座済裁策冊蚕至私姿視詞誌磁射捨尺若樹収宗就衆従縦縮熟純処署諸除承将傷障蒸針仁垂推寸盛聖誠舌宣専泉洗染銭善奏窓創装層操蔵臓存尊退宅担探誕段暖値宙忠著庁頂腸潮賃痛敵展討党糖届難乳認納脳派拝背肺俳班晩否批秘俵腹奮並陛閉片補暮宝訪亡忘棒枚幕密盟模訳郵優預幼欲翌乱卵覧裏律臨朗論" + } + }, + "HEISEI4": { + "source": "https://www.mext.go.jp/a_menu/shotou/new-cs/youryou/syo/koku/001.htm", + "characters": { + "GRADE1": "一右雨円王音下火花貝学気九休玉金空月犬見五口校左三山子四糸字耳七車手十出女小上森人水正生青夕石赤千川先早草足村大男竹中虫町天田土二日入年白八百文木本名目立力林六", + "GRADE2": "引羽雲園遠何科夏家歌画回会海絵外角楽活間丸岩顔汽記帰弓牛魚京強教近兄形計元言原戸古午後語工公広交光考行高黄合谷国黒今才細作算止市矢姉思紙寺自時室社弱首秋週春書少場色食心新親図数西声星晴切雪船線前組走多太体台地池知茶昼長鳥朝直通弟店点電刀冬当東答頭同道読内南肉馬売買麦半番父風分聞米歩母方北毎妹万明鳴毛門夜野友用曜来里理話", + "GRADE3": "悪安暗医委意育員院飲運泳駅央横屋温化荷界開階寒感漢館岸起期客究急級宮球去橋業曲局銀区苦具君係軽血決研県庫湖向幸港号根祭皿仕死使始指歯詩次事持式実写者主守取酒受州拾終習集住重宿所暑助昭消商章勝乗植申身神真深進世整昔全相送想息速族他打対待代第題炭短談着注柱丁帳調追定庭笛鉄転都度投豆島湯登等動童農波配倍箱畑発反坂板皮悲美鼻筆氷表秒病品負部服福物平返勉放味命面問役薬由油有遊予羊洋葉陽様落流旅両緑礼列練路和", + "GRADE4": "愛案以衣位囲胃印英栄塩億加果貨課芽改械害街各覚完官管関観願希季紀喜旗器機議求泣救給挙漁共協鏡競極訓軍郡径型景芸欠結建健験固功好候航康告差菜最材昨札刷殺察参産散残士氏史司試児治辞失借種周祝順初松笑唱焼象照賞臣信成省清静席積折節説浅戦選然争倉巣束側続卒孫帯隊達単置仲貯兆腸低底停的典伝徒努灯堂働特得毒熱念敗梅博飯飛費必票標不夫付府副粉兵別辺変便包法望牧末満未脈民無約勇要養浴利陸良料量輪類令冷例歴連老労録", + "GRADE5": "圧移因永営衛易益液演応往桜恩可仮価河過賀快解格確額刊幹慣眼基寄規技義逆久旧居許境均禁句群経潔件券険検限現減故個護効厚耕鉱構興講混査再災妻採際在財罪雑酸賛支志枝師資飼示似識質舎謝授修述術準序招承証条状常情織職制性政勢精製税責績接設舌絶銭祖素総造像増則測属率損退貸態団断築張提程適敵統銅導徳独任燃能破犯判版比肥非備俵評貧布婦富武復複仏編弁保墓報豊防貿暴務夢迷綿輸余預容略留領", + "GRADE6": "異遺域宇映延沿我灰拡革閣割株干巻看簡危机揮貴疑吸供胸郷勤筋系敬警劇激穴絹権憲源厳己呼誤后孝皇紅降鋼刻穀骨困砂座済裁策冊蚕至私姿視詞誌磁射捨尺若樹収宗就衆従縦縮熟純処署諸除将傷障城蒸針仁垂推寸盛聖誠宣専泉洗染善奏窓創装層操蔵臓存尊宅担探誕段暖値宙忠著庁頂潮賃痛展討党糖届難乳認納脳派拝背肺俳班晩否批秘腹奮並陛閉片補暮宝訪亡忘棒枚幕密盟模訳郵優幼欲翌乱卵覧裏律臨朗論" + } + }, + "SHOWA55": { + "source": "https://ja.wikipedia.org/wiki/学年別漢字配当表_(1977-1988)", + "characters": { + "GRADE1": "一右雨円王音下火花学気九休金空月犬見五口校左三山子四糸字耳七車手十出女小上森人水正生青夕石赤千川先早足村大男中虫町天田土二日入年白八百文木本名目立力林六", + "GRADE2": "引雲遠何科夏家歌画回会海絵貝外間顔汽記帰牛魚京教強玉近形計元原戸古午後語工広交光行考高黄合谷国黒今才作算止市思紙寺自時室社弱首秋春書少場色食心新親図数西声星晴切雪船前組走草多太体台池地知竹茶昼長鳥朝通弟店点電冬刀当東答頭同道読南馬買売麦半番父風分聞米歩母方北毎妹明鳴毛門夜野友用曜来楽里理話", + "GRADE3": "悪安暗医意育員院飲運泳駅園横屋温化荷界開階角活寒感館岸岩起期客究急級宮球去橋業曲局銀苦具君兄係軽血決県研言庫湖公向幸港号根祭細仕死使始指歯詩次事持式実写者主守取酒受州拾終習週集住重所暑助昭消商章勝乗植申身神深進世整線全送息族他打対待代第題炭短着注柱帳調直追丁定庭鉄転都度投島湯登等動童内肉農波配畑発反坂板皮悲美鼻氷表秒病品負部服福物平返勉放万味命面問役薬由油有遊予洋葉陽様落流旅両緑礼列路和", + "GRADE4": "愛案衣以囲位委胃印英栄塩央億加貨課芽改械害各覚完官漢管関観願希季紀喜旗器機議求救給挙漁共協鏡競極区軍郡型景芸欠結建健験固功候航康告差菜最材昨刷殺察参散産残士氏史司姉試辞失借種周宿順初省唱照賞焼臣信真成清勢静席積折節説浅戦選然争相倉想象速側続卒孫帯隊達単談治置貯腸低底停的典伝徒努灯堂働毒熱念敗倍博飯飛費必筆票標不夫付府副粉兵別辺変便包法望牧末満脈民約勇要養浴利陸良料量輪類令冷例歴連練老労録", + "GRADE5": "圧易移因営永衛液益演往応恩仮価果河過賀解快格確額刊幹慣歓眼基寄規技義逆久旧居許境興均禁句訓群経潔件券検絹険減現限個故護効厚構耕講鉱混査再妻採災際在罪財雑蚕賛酸師志支資似児示識質舎謝授収修衆祝述術準序除招承称証常条状情織職制性政精製税責績接設舌絶銭善祖素総造像増則測属損退貸態団断築張提程敵適統導銅得徳特独任燃能破犯判版比非肥備俵評貧婦布富武復複仏編弁保墓報豊防貿暴未務無迷綿輸余預容率略留領", + "GRADE6": "異遺域壱宇羽映延沿可我灰街革拡閣割株干巻看勧簡丸危机揮貴疑弓吸泣供胸郷勤筋系径敬警劇穴兼憲権源厳己呼誤后好孝皇紅降鋼刻穀骨困砂座済裁策冊至私姿視詞誌矢磁射捨尺釈若需樹宗就従縦縮熟純処署諸将笑傷障城蒸針仁垂推寸是聖誠宣専染泉洗奏窓創層操蔵臓俗存尊宅担探段暖値仲宙忠著庁兆頂潮賃痛展党討糖届難弐乳認納脳派拝肺背俳班晩否批秘腹奮陛閉片補宝訪亡忘棒枚幕密盟模訳郵優幼羊欲翌乱卵覧裏律臨朗論" + } + }, + "SHOWA36": { + "source": "https://ja.wikipedia.org/wiki/学年別漢字配当表_(1958-1967)", + "characters": { + "GRADE1": "一右雨下火花九金月五口左三山子四耳七手十女小上森人水正生青石赤川先足大中田土二日白八木本目六", + "GRADE2": "雲円王音何夏家会海外学間気汽休牛京玉空犬見元古戸光工校考行高合谷国黒今作思糸紙字時車秋出春書少色心声西夕切雪千前組早草走村多男知地池竹虫朝町長鳥天冬東道読南入年馬麦半百父風分文米歩母方北名明毛門夜友用来立力林話", + "GRADE3": "悪安暗意引運駅園遠黄屋温化科歌荷画回界絵開貝角楽活寒感岸岩顔期帰記起客急球究級去魚強教橋局近銀苦君兄形計決研県原庫午後語交公向広号根才細算仕使始市指止死事寺持次自室実社者弱主取首受終週集住重所暑助勝昭乗場食新深申神親身進図数世星晴船全送太体待台第炭茶着昼柱注追通弟鉄店点電都度刀島投当答頭動同肉波配買売畑発坂板番皮美表病品負物聞平返勉妹毎万鳴面野役由遊曜様葉落理里流旅両礼和", + "GRADE4": "愛案以位囲委衣医育印員飲院泳英塩横加貨芽改械階害覚官観関館願喜器旗機季宮挙競共協鏡業曲極具郡係景軽芸結血建言固湖幸港航告差最祭菜材昨刷察散産残司史士姉詩試歯治式失写借守種酒州拾習順初商唱消焼照章植信真臣勢成整清静席積節戦線選然争相息速族続卒孫他打対隊代題達短談置丁帳調直停定底庭的転徒登努湯燈等働堂童内熱農反悲費飛鼻必氷秒不付夫府部服福粉別変便包放法望末味脈民命問薬油勇有予洋陽利陸料良緑輪類冷歴列練連路労老録", + "GRADE5": "圧易移胃因栄永衛液演央往応億恩仮価果河課過賀解快各格確完慣漢管寄希紀規技義議久救求給居許漁興均句区群軍型経欠件健験現限個護候功厚康講鉱査際在殺雑参蚕賛酸師志支氏似示辞質識舎謝収周修宿祝術準序承省象賞常情織性政精製績責接折設説浅銭祖素倉想総像増造側則測帯貸単団築貯張腸低敵適典伝統導銅特毒独任念燃能破敗倍博飯比肥非備筆俵標票貧婦布武副復仏兵編辺弁保報貿防牧満務無迷綿約輸余容要養浴留量領令例", + "GRADE6": "異遺壱営益延可我拡革額株刊勧幹歓眼基貴疑逆旧供境勤禁訓敬系潔兼券憲検権絹険厳減己故誤効后孝構皇耕穀混再妻採済災罪財策私至視詞資児釈授需宗就衆従述純処諸除招証称条状職仁推是制聖誠税絶舌宣専善創蔵俗属存尊損態退断忠著賃提程展党討得徳届難弐認納派拝判版犯否評富複奮陛補墓豊暴未盟訳預欲律率略臨論" + } + } + } + }, + "JLPT": { + "description": "Set of kanji tested on the Japanese Language Proficiency Test.", + "default": "TANOS", + "versions": { + "TANOS": { + "source": "http://www.tanos.co.uk/jlpt/skills/kanji/", + "characters": { + "N5": "日一国人年大十二本中長出三時行見月後前生五間上東四今金九入学高円子外八六下来気小七山話女北午百書先名川千水半男西電校語土木聞食車何南万毎白天母火右読友左休父雨", + "N4": "会同事自社発者地業方新場員立開手力問代明動京目通言理体田主題意不作用度強公持野以思家世多正安院心界教文元重近考画海売知道集別物使品計死特私始朝運終台広住真有口少町料工建空急止送切転研足究楽起着店病質待試族銀早映親験英医仕去味写字答夜音注帰古歌買悪図週室歩風紙黒花春赤青館屋色走秋夏習駅洋旅服夕借曜飲肉貸堂鳥飯勉冬昼茶弟牛魚兄犬妹姉漢", + "N3": "政議民連対部合市内相定回選米実関決全表戦経最現調化当約首法性要制治務成期取都和機平加受続進数記初指権支産点報済活原共得解交資予向際勝面告反判認参利組信在件側任引求所次昨論官増係感情投示変打直両式確果容必演歳争談能位置流格疑過局放常状球職与供役構割費付由説難優夫収断石違消神番規術備宅害配警育席訪乗残想声念助労例然限追商葉伝働形景落好退頭負渡失差末守若種美命福望非観察段横深申様財港識呼達良候程満敗値突光路科積他処太客否師登易速存飛殺号単座破除完降責捕危給苦迎園具辞因馬愛富彼未舞亡冷適婦寄込顔類余王返妻背熱宿薬険頼覚船途許抜便留罪努精散静婚喜浮絶幸押倒等老曲払庭徒勤遅居雑招困欠更刻賛抱犯恐息遠戻願絵越欲痛笑互束似列探逃遊迷夢君閉緒折草暮酒悲晴掛到寝暗盗吸陽御歯忘雪吹娘誤洗慣礼窓昔貧怒泳祖杯疲皆鳴腹煙眠怖耳頂箱晩寒髪忙才靴恥偶偉猫幾", + "N2": "党協総区領県設改府査委軍団各島革村勢減再税営比防補境導副算輸述線農州武象域額欧担準賞辺造被技低復移個門課脳極含蔵量型況針専谷史階管兵接細効丸湾録省旧橋岸周材戸央券編捜竹超並療採森競介根販歴将幅般貿講林装諸劇河航鉄児禁印逆換久短油暴輪占植清倍均億圧芸署伸停爆陸玉波帯延羽固則乱普測豊厚齢囲卒略承順岩練軽了庁城患層版令角絡損募裏仏績築貨混昇池血温季星永著誌庫刊像香坂底布寺宇巨震希触依籍汚枚複郵仲栄札板骨傾届巻燃跡包駐弱紹雇替預焼簡章臓律贈照薄群秒奥詰双刺純翌快片敬悩泉皮漁荒貯硬埋柱祭袋筆訓浴童宝封胸砂塩賢腕兆床毛緑尊祝柔殿濃液衣肩零幼荷泊黄甘臣浅掃雲掘捨軟沈凍乳恋紅郊腰炭踊冊勇械菜珍卵湖喫干虫刷湯溶鉱涙匹孫鋭枝塗軒毒叫拝氷乾棒祈拾粉糸綿汗銅湿瓶咲召缶隻脂蒸肌耕鈍泥隅灯辛磨麦姓筒鼻粒詞胃畳机膚濯塔沸灰菓帽枯涼舟貝符憎皿肯燥畜挟曇滴伺", + "N1": "氏統保第結派案策基価提挙応企検藤沢裁証援施井護展態鮮視条幹独宮率衛張監環審義訴株姿閣衆評影松撃佐核整融製票渉響推請器士討攻崎督授催及憲離激摘系批郎健盟従修隊織拡故振弁就異献厳維浜遺塁邦素遣抗模雄益緊標宣昭廃伊江僚吉盛皇臨踏壊債興源儀創障継筋闘葬避司康善逮迫惑崩紀聴脱級博締救執房撤削密措志載陣我為抑幕染奈傷択秀徴弾償功拠秘拒刑塚致繰尾描鈴盤項喪伴養懸街契掲躍棄邸縮還属慮枠恵露沖緩節需射購揮充貢鹿却端賃獲郡併徹貴衝焦奪災浦析譲称納樹挑誘紛至宗促慎控智握宙俊銭渋銃操携診託撮誕侵括謝駆透津壁稲仮裂敏是排裕堅訳芝綱典賀扱顧弘看訟戒祉誉歓奏勧騒閥甲縄郷揺免既薦隣華範隠徳哲杉釈己妥威豪熊滞微隆症暫忠倉彦肝喚沿妙唱阿索誠襲懇俳柄驚麻李浩剤瀬趣陥斎貫仙慰序旬兼聖旨即柳舎偽較覇詳抵脅茂犠旗距雅飾網竜詩繁翼潟敵魅嫌斉敷擁圏酸罰滅礎腐脚潮梅尽僕桜滑孤炎賠句鋼頑鎖彩摩励縦輝蓄軸巡稼瞬砲噴誇祥牲秩帝宏唆阻泰賄撲堀菊絞縁唯膨矢耐塾漏慶猛芳懲剣彰棋丁恒揚冒之倫陳憶潜梨仁克岳概拘墓黙須偏雰遇諮狭卓亀糧簿炉牧殊殖艦輩穴奇慢鶴謀暖昌拍朗寛覆胞泣隔浄没暇肺貞靖鑑飼陰銘随烈尋稿丹啓也丘棟壌漫玄粘悟舗妊熟旭恩騰往豆遂狂岐陛緯培衰艇屈径淡抽披廷錦准暑磯奨浸剰胆繊駒虚霊帳悔諭惨虐翻墜沼据肥徐糖搭盾脈滝軌俵妨擦鯨荘諾雷漂懐勘栽拐駄添冠斜鏡聡浪亜覧詐壇勲魔酬紫曙紋卸奮欄逸涯拓眼獄尚彫穏顕巧矛垣欺釣萩粛栗愚嘉遭架鬼庶稚滋幻煮姫誓把践呈疎仰剛疾征砕謡嫁謙后嘆菌鎌巣頻琴班棚潔酷宰廊寂辰霞伏碁俗漠邪晶墨鎮洞履劣那殴娠奉憂朴亭淳怪鳩酔惜穫佳潤悼乏該赴桑桂髄虎盆晋穂壮堤飢傍疫累痴搬晃癒桐寸郭尿凶吐宴鷹賓虜陶鐘憾猪紘磁弥昆粗訂芽庄傘敦騎寧循忍怠如寮祐鵬鉛珠凝苗獣哀跳匠垂蛇澄縫僧眺亘呉凡憩媛溝恭刈睡錯伯笹穀陵霧魂弊妃舶餓窮掌麗綾臭悦刃縛暦宜盲粋辱毅轄猿弦稔窒炊洪摂飽冗桃狩朱渦紳枢碑鍛刀鼓裸猶塊旋弓幣膜扇腸槽慈楊伐駿漬糾亮墳坪紺娯椿舌羅峡俸厘峰圭醸蓮弔乙汁尼遍衡薫猟羊款閲偵喝敢胎酵憤豚遮扉硫赦窃泡瑞又慨紡恨肪扶戯伍忌濁奔斗蘭迅肖鉢朽殻享秦茅藩沙輔媒鶏禅嘱胴迭挿嵐椎絹陪剖譜郁悠淑帆暁傑楠笛玲奴錠拳翔遷拙侍尺峠篤肇渇叔雌亨堪叙酢吟逓嶺甚喬崇漆岬癖愉寅礁乃洲屯樺槙姻巌擬塀唇睦閑胡幽峻曹詠卑侮鋳抹尉槻隷禍蝶酪茎帥逝汽琢匿襟蛍蕉寡琉痢庸朋坑藍賊搾畔遼唄孔橘漱呂拷嬢苑巽杜渓翁廉謹瞳湧欣窯褒醜升殉煩巴禎劾堕租稜桟倭婿慕斐罷矯某囚魁虹鴻泌於赳漸蚊葵厄藻禄孟嫡尭嚇巳凸暢韻霜硝勅芹杏棺儒鳳馨慧愁楼彬匡眉欽薪褐賜嵯綜繕栓翠鮎榛凹艶惣蔦錬隼渚衷逐斥稀芙詔皐雛惟佑耀黛渥憧宵妄惇脩甫酌蚕嬉蒼暉頒只肢檀凱彗謄梓丑嗣叶汐絢朔伽畝抄爽黎惰蛮冴旺萌偲壱瑠允侯蒔鯉弧遥舜瑛附彪卯但綺芋茜凌皓洸毬婆緋鯛怜邑倣碧啄穣酉悌倹柚繭亦詢采紗賦眸玖弐錘諄倖痘笙侃裟洵爾耗昴銑莞伶碩宥滉晏伎朕迪綸且竣晨吏燦麿頌箇楓琳梧哉澪匁晟衿凪梢丙颯茄勺恕蕗瑚遵瞭燎虞柊侑謁斤嵩捺蓉茉袈燿誼冶栞墾勁菖旦椋叡紬胤凜亥爵脹麟莉汰瑶瑳耶椰絃丞璃奎塑昂柾熙菫諒鞠崚濫捷" + } + } + } + }, + "HYOGAI": { + "description": "Set of kanji not in the Joyo or Jinmeiyo lists that are rarely used.", + "default": "WIKIPEDIA", + "versions": { + "WIKIPEDIA": { + "source": "https://ja.wikipedia.org/wiki/表外漢字字体表の漢字一覧", + "characters": { + "MAIN": "唖蛙鴉埃挨曖靄軋斡按庵鞍闇已夷畏韋帷萎椅葦彙飴謂閾溢鰯尹咽殷淫隕蔭于迂盂烏鬱云暈穢曳洩裔穎嬰翳腋曰奄宛怨俺冤袁婉焉堰淵焰筵厭鳶燕閻嚥嗚凰嘔鴨甕襖謳鶯鴎鸚臆俤瓜呵苛珂迦訛訶跏嘩瑕榎窩蝦蝸鍋顆牙瓦臥俄峨訝蛾衙駕芥乖廻徊恢晦堺潰鞋諧檜蟹咳崖蓋漑骸鎧喀廓摑撹愕萼諤顎鰐樫絣筈葛闊鰹萱奸串旱函咸姦宦柑竿悍桓涵菅嵌鉗澗翰諫瞰韓檻灌玩雁翫頷癌贋几卉其祁耆埼悸揆毀箕畿窺諱徽櫃妓祇魏蟻掬麹吃屹拮謔仇臼汲灸咎邱柩笈躬厩嗅舅炬渠裾噓墟鋸遽欅匈怯俠脇莢竟卿僑嬌蕎鋏頰橿疆饗棘髷巾僅禽饉狗惧軀懼倶喰寓窟粂偈荊珪畦脛頃痙詣禊閨稽頸髻蹊鮭繫睨戟隙抉頁訣蕨姸倦虔捲牽喧硯腱鍵瞼鹸呟眩舷諺乎姑狐股涸菰袴壺跨糊醐齬亢勾叩尻吼肛岡庚杭肴咬垢巷恍恰狡桁胱崗梗喉腔蛤幌煌鉤敲睾膏閤膠篝縞薨糠藁鮫壙曠劫毫傲壕濠噛轟剋哭鵠乞忽惚昏痕渾褌叉些嗟蓑磋坐挫晒柴砦犀賽鰓榊柵炸窄簀刹拶紮撒薩珊餐纂霰攢讃斬懺仔弛此址祀屍屎柿茨恣砥祠翅舐疵趾斯覗嗜滓獅幟摯嘴熾髭贄而峙痔餌竺雫叱悉蛭嫉膝櫛柘洒娑這奢闍杓灼綽錫雀惹娶腫諏鬚呪竪綬聚濡襦帚酋袖羞葺蒐箒皺輯鍬繍蹴讐鷲廿揉絨粥戌閏楯馴杵薯藷汝抒鋤妾哨秤娼逍廂椒湘竦鈔睫蛸鉦摺蒋裳誦漿蕭踵鞘篠聳鍾醤囁杖茸嘗擾攘饒拭埴蜀蝕燭褥沁芯呻宸疹蜃滲賑鍼壬訊腎靱塵儘笥祟膵誰錐雖隋隧芻趨鮨丼凄栖棲甥貰蜻醒錆臍瀞鯖脆贅脊戚晰蹟泄屑浙啜楔截尖苫穿閃陝釧揃煎羨腺詮煽箋撰箭賤蟬癬喘膳狙疽疏甦楚鼠遡蘇齟爪宋炒叟蚤曾湊葱掻槍漕箏噌瘡痩踪艘薔甑叢藪躁囃竈鰺仄捉塞粟杣遜噂樽鱒侘咤詫陀拿荼唾舵楕驒苔殆堆碓腿頽戴醍托鐸凧襷燵坦疸耽啖蛋毯湛痰綻憚歎簞譚灘雉馳蜘緻筑膣肘冑紐酎厨蛛註誅疇躊佇楮箸儲瀦躇吊帖喋貼牒趙銚嘲諜寵捗枕槌鎚辻剃挺釘掟梯逞啼碇鼎綴鄭薙諦蹄鵜荻擢溺姪轍辿唸塡篆顚囀纏佃淀澱臀兎妬兜堵屠賭宕沓套疼桶淘萄逗棹樋蕩鄧橙濤檮櫂禱撞禿瀆栃咄沌遁頓呑貪邇匂韮涅禰捏捻撚膿囊杷爬琶頗播芭罵蟇胚徘牌稗狽煤帛柏剝粕箔莫駁瀑曝畠捌撥潑醱筏跋噺氾汎阪叛袢絆斑槃幡攀挽磐蕃屁庇砒脾痺鄙誹臂枇毘梶媚琵薇靡疋畢逼謬豹憑瓢屏廟牝瀕憫鬢斧阜訃俯釜腑孵鮒巫葡撫蕪諷祓吻扮焚糞并聘蔽餅斃袂僻璧襞蔑瞥扁篇騙娩鞭哺圃蒲戊牡姥菩呆彷庖苞疱捧逢蜂蓬鞄鋒牟芒茫虻榜膀貌鉾謗吠卜勃梵昧邁枡俣沫迄曼蔓瞞饅鬘鰻蜜鵡冥瞑謎麺蒙朦勿籾悶揶爺鑓喩揄愈楡尤釉楢猷飫輿孕妖拗涌痒傭熔瘍蠅沃螺萊蕾洛埒拉辣瀾爛鸞狸裡罹籬戮慄掠笠溜榴劉瘤侶梁聊菱寥蓼淋燐鱗屢蛉蠣櫟礫轢煉漣憐簾鰊攣賂魯沪廬櫓蘆鷺弄牢狼榔瘻臈臘朧蝋籠聾肋勒漉麓窪歪猥隈或罠椀碗彎", + "ELEMENTS": "氦鋰鈹硼氮氧氟鈉鎂鋁硅磷氬鉀鈣鈦釩鉻錳鈷鋅鎵鍺砷硒鍶釔鈮銠鈀鎘銻碲碘銫鋇鉿鋨銥鉑鉈鉍釙鐳鈩鐽錀鎶鎶鈰釹釤釓鈥鐿鎦釷鏷鈾鋂鑀鐨鍆鍩鐒" + } + } + } + } +} \ No newline at end of file diff --git a/src/commands/kanji.rs b/src/commands/kanji.rs new file mode 100644 index 0000000..d6f5ed7 --- /dev/null +++ b/src/commands/kanji.rs @@ -0,0 +1,110 @@ +use serenity::framework::standard::{macros::command, Args, CommandResult}; +use serenity::model::prelude::*; +use serenity::prelude::*; + +use std::fs::File; +use std::io::Read; +use serde_json::Value; + +use rand::seq::IteratorRandom; + +fn random_from_string(string: &str) -> char { + string.chars().choose(&mut rand::thread_rng()).unwrap() +} + +async fn display_kanji(ctx: &Context, msg: &Message, kanji: char, comment: &str) -> CommandResult { + msg.reply(&ctx.http, format!(":game_die: {}{}", kanji, comment)).await?; + let url = format!("https://raw.githubusercontent.com/mistval/kanji_images/master/gifs/{}.gif", format!("{:x}", kanji as i32)); + let response = reqwest::get(&url) + .await? + .text() + .await?; + msg.channel_id.say(&ctx.http, if response == "404: Not Found" { + "The stroke order diagram for this kanji is unavailable." + } else { &url }).await?; + Ok(()) +} + +async fn random_kanji(category: &str, ctx: &Context, msg: &Message, mut args: Args) -> CommandResult { + let mut lists_file = File::open("kanji_lists.json").unwrap(); + let mut lists_json = String::new(); + lists_file.read_to_string(&mut lists_json).unwrap(); + let lists_data: Value = serde_json::from_str(&lists_json).unwrap(); + let category = &lists_data[category]; + let default_version = category["default"].as_str().unwrap(); + let list = &category["versions"][default_version]["characters"]; + match list.as_str() { + Some(string) => { + let kanji = random_from_string(string); + display_kanji(&ctx, &msg, kanji, "").await?; + }, + None => { + let subcategory = args.single::(); + let subcategories = list.as_object().unwrap(); + let subcategory_list = { + let mut string = String::from("\n"); + let mut total_count = 0; + for subcategory in subcategories.keys() { + let subcategory = subcategory.as_str(); + // One has to do .chars().count() as opposed to .len() here, + // because .len() returns the byte length NOT the number of characters. + // For kanji, they are always multi-byte Unicode characters. + let count = &subcategories[subcategory].as_str().unwrap().chars().count(); + total_count += count; + string.push_str(&format!("**{}** ({} kanji),\n", subcategory, count)); + } + string.push_str(&format!("or **all** ({} kanji total) for all subcategories", total_count)); + string + }; + match subcategory { + Ok(string) => { + let string = string.to_uppercase(); + if string == "ALL" { + let subcategory_key = subcategories.keys().choose(&mut rand::thread_rng()).unwrap(); + let list = subcategories[subcategory_key].as_str().unwrap(); + let kanji = random_from_string(&list); + display_kanji(&ctx, &msg, kanji, &format!(", **{}**", subcategory_key)).await?; + } else if subcategories.contains_key(&string) { + let list = list[&string].as_str().unwrap(); + let kanji = random_from_string(&list); + display_kanji(&ctx, &msg, kanji, "").await?; + } else { + let message = format!("That is an invalid subcategory. Please use {}.", &subcategory_list); + msg.reply(&ctx.http, message).await?; + } + }, + Err(_) => { + let mut message = String::from("Please specify a subcategory: "); + message.push_str(&subcategory_list); + msg.reply(&ctx.http, message).await?; + } + } + } + } + Ok(()) +} + +#[command] +async fn joyo(ctx: &Context, msg: &Message, args: Args) -> CommandResult { + random_kanji("JOYO", ctx, msg, args).await +} + +#[command] +async fn jinmeiyo(ctx: &Context, msg: &Message, args: Args) -> CommandResult { + random_kanji("JINMEIYO", ctx, msg, args).await +} + +#[command] +async fn kyoiku(ctx: &Context, msg: &Message, args: Args) -> CommandResult { + random_kanji("KYOIKU", ctx, msg, args).await +} + +#[command] +async fn jlpt(ctx: &Context, msg: &Message, args: Args) -> CommandResult { + random_kanji("JLPT", ctx, msg, args).await +} + +#[command] +async fn hyogai(ctx: &Context, msg: &Message, args: Args) -> CommandResult { + random_kanji("HYOGAI", ctx, msg, args).await +} \ No newline at end of file diff --git a/src/commands/mod.rs b/src/commands/mod.rs new file mode 100644 index 0000000..e0f63bf --- /dev/null +++ b/src/commands/mod.rs @@ -0,0 +1,2 @@ +pub mod kanji; +pub mod owner; \ No newline at end of file diff --git a/src/commands/owner.rs b/src/commands/owner.rs new file mode 100644 index 0000000..c54249e --- /dev/null +++ b/src/commands/owner.rs @@ -0,0 +1,22 @@ +use serenity::framework::standard::{macros::command, CommandResult}; +use serenity::model::prelude::*; +use serenity::prelude::*; + +use crate::ShardManagerContainer; + +#[command] +#[owners_only] +async fn sleep(ctx: &Context, msg: &Message) -> CommandResult { + let data = ctx.data.read().await; + + if let Some(manager) = data.get::() { + msg.reply(ctx, "Good night!").await?; + manager.lock().await.shutdown_all().await; + } else { + msg.reply(ctx, "There was a problem getting the shard manager").await?; + + return Ok(()); + } + + Ok(()) +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index e7a11a9..71f0e12 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,102 @@ -fn main() { - println!("Hello, world!"); +//! Requires the 'framework' feature flag be enabled in your project's +//! `Cargo.toml`. +//! +//! This can be enabled by specifying the feature in the dependency section: +//! +//! ```toml +//! [dependencies.serenity] +//! git = "https://github.com/serenity-rs/serenity.git" +//! features = ["framework", "standard_framework"] +//! ``` +mod commands; + +use std::{collections::HashSet, env, sync::Arc}; + +use commands::{kanji::*, owner::*}; +use serenity::{ + async_trait, + client::bridge::gateway::ShardManager, + framework::{standard::macros::group, StandardFramework}, + http::Http, + model::{event::ResumedEvent, gateway::Ready}, + prelude::*, +}; +use tracing::{error, info}; + +pub struct ShardManagerContainer; + +impl TypeMapKey for ShardManagerContainer { + type Value = Arc>; +} + +struct Handler; + +#[async_trait] +impl EventHandler for Handler { + async fn ready(&self, _: Context, ready: Ready) { + info!("Connected as {}", ready.user.name); + } + + async fn resume(&self, _: Context, _: ResumedEvent) { + info!("Resumed"); + } +} + +#[group] +#[commands(joyo, jinmeiyo, kyoiku, jlpt, hyogai, sleep)] +struct General; + +#[tokio::main] +async fn main() { + // This will load the environment variables located at `./.env`, relative to + // the CWD. See `./.env.example` for an example on how to structure this. + dotenv::dotenv().expect("Failed to load .env file"); + + // Initialize the logger to use environment variables. + // + // In this case, a good default is setting the environment variable + // `RUST_LOG` to `debug`. + tracing_subscriber::fmt::init(); + + let token = env::var("DISCORD_TOKEN").expect("Expected a token in the environment"); + let prefix = env::var("PREFIX").expect("Expected a prefix in the environment"); + + let http = Http::new_with_token(&token); + + // We will fetch your bot's owners and id + let (owners, _bot_id) = match http.get_current_application_info().await { + Ok(info) => { + let mut owners = HashSet::new(); + owners.insert(info.owner.id); + + (owners, info.id) + }, + Err(why) => panic!("Could not access application info: {:?}", why), + }; + + // Create the framework + let framework = + StandardFramework::new().configure(|c| c.owners(owners).prefix(prefix)).group(&GENERAL_GROUP); + + let mut client = Client::builder(&token) + .framework(framework) + .event_handler(Handler) + .await + .expect("Err creating client"); + + { + let mut data = client.data.write().await; + data.insert::(client.shard_manager.clone()); + } + + let shard_manager = client.shard_manager.clone(); + + tokio::spawn(async move { + tokio::signal::ctrl_c().await.expect("Could not register ctrl+c handler"); + shard_manager.lock().await.shutdown_all().await; + }); + + if let Err(why) = client.start().await { + error!("Client error: {:?}", why); + } }