@@ -6,6 +6,7 @@ import logger from '../lib/logger';
66/* eslint-disable no-unused-vars */
77import type { SlackInterface , SlashCommandEndpoint } from '../lib/slack' ;
88import { getMemberName , getMemberIcon } from '../lib/slackUtils' ;
9+ import { Loader } from '../lib/utils' ;
910
1011const log = logger . child ( { bot : 'emoxpand' } ) ;
1112
@@ -39,20 +40,24 @@ const logError = (err: Error, mesg: string): void => {
3940const emojiData = 'bigemojis.json' ;
4041const emojiPath = path . resolve ( __dirname , emojiData ) ;
4142
42- let allEmojis : EmojiTable = new Map ( ) ;
43-
44- const loadEmojis = async ( ) => {
45- allEmojis = new Map ( ) ;
46- const data = await fs . readFile ( emojiPath , { encoding : 'utf8' } ) ;
47- const obj : { [ key : string ] : EmojiContent } = JSON . parse ( data ) ;
48- log . info ( 'emoxpand: loading big emojis...' ) ;
49- for ( const [ name , content ] of Object . entries ( obj ) ) {
50- allEmojis . set ( name , emojiFromContent ( content ) ) ;
43+ const emojisLoader = new Loader < EmojiTable > ( async ( ) => {
44+ const emojis : EmojiTable = new Map ( ) ;
45+ try {
46+ const data = await fs . readFile ( emojiPath , { encoding : 'utf8' } ) ;
47+ const obj : { [ key : string ] : EmojiContent } = JSON . parse ( data ) ;
48+ log . info ( 'emoxpand: loading big emojis...' ) ;
49+ for ( const [ name , content ] of Object . entries ( obj ) ) {
50+ emojis . set ( name , emojiFromContent ( content ) ) ;
51+ }
52+ } catch ( err : unknown ) {
53+ if ( err instanceof Error && 'code' in err && err . code === 'ENOENT' ) {
54+ logError ( err , 'failed to load big emojis' ) ;
55+ } else {
56+ throw err ;
57+ }
5158 }
52- return allEmojis ;
53- } ;
54-
55- loadEmojis ( ) ;
59+ return emojis ;
60+ } ) ;
5661
5762const emojisToJson = ( emojis : EmojiTable ) : string => {
5863 const obj = Object . fromEntries (
@@ -66,7 +71,8 @@ const storeEmojis = (emojis: EmojiTable): void => {
6671} ;
6772
6873
69- const addEmoji = ( name : EmojiName , emoji : BigEmoji ) : void => {
74+ const addEmoji = async ( name : EmojiName , emoji : BigEmoji ) : Promise < void > => {
75+ const allEmojis = await emojisLoader . load ( ) ;
7076 allEmojis . set ( name , emoji ) ;
7177 storeEmojis ( allEmojis ) ;
7278} ;
@@ -97,7 +103,8 @@ interface Token {
97103}
98104
99105
100- const expandEmoji = ( text : string ) : string => {
106+ const expandEmoji = async ( text : string ) : Promise < string > => {
107+ const allEmojis = await emojisLoader . load ( ) ;
101108 let replacementCount = 0 ;
102109 const result = _ . flatMap ( text . split ( '\n' ) , ( line ) => {
103110 const [ , , tokens ] = ( line + '\n' ) . split ( '' ) . reduce < [ TokenType , string [ ] , Token [ ] ] > (
@@ -112,7 +119,8 @@ const expandEmoji = (text: string): string => {
112119 kind : 'Plain' ,
113120 content : `!${ content } !` ,
114121 } ) ;
115- } else {
122+ }
123+ else {
116124 parsed . push ( {
117125 kind : parsing ,
118126 content : chars . join ( '' ) ,
@@ -208,7 +216,7 @@ export const server = ({eventClient, webClient: slack}: SlackInterface) => plugi
208216 }
209217 slack . chat . postMessage ( {
210218 channel : request . body . channel_id ,
211- text : expandEmoji ( request . body . text ) ,
219+ text : await expandEmoji ( request . body . text ) ,
212220 username : await getMemberName ( request . body . user_id ) ,
213221 icon_url : await getMemberIcon ( request . body . user_id , 192 ) ,
214222 } ) ;
@@ -217,9 +225,10 @@ export const server = ({eventClient, webClient: slack}: SlackInterface) => plugi
217225 // }}}
218226
219227 // Emoji list API {{{
220- fastify . get ( '/emoxpand/list' , ( _ , response ) => {
228+ fastify . get ( '/emoxpand/list' , async ( _ , response ) => {
221229 response . header ( 'Content-Type' , 'applicaton/json' ) . code ( 200 ) ;
222- return Promise . resolve ( emojisToJson ( allEmojis ) ) ;
230+ const allEmojis = await emojisLoader . load ( ) ;
231+ return emojisToJson ( allEmojis ) ;
223232 } ) ;
224233 // }}}
225234
@@ -240,6 +249,7 @@ export const server = ({eventClient, webClient: slack}: SlackInterface) => plugi
240249
241250 // Big Emoji list {{{
242251 if ( / ^ 大 (?: 絵 文 字 | e m o j i ) 一 覧 $ / . test ( message . text ) ) {
252+ const allEmojis = await emojisLoader . load ( ) ;
243253 const emojiNames = Array . from ( allEmojis . keys ( ) ) ;
244254 if ( emojiNames . length === 0 ) {
245255 postMessage ( '登録されている大絵文字はありません' ) ;
@@ -287,7 +297,7 @@ export const server = ({eventClient, webClient: slack}: SlackInterface) => plugi
287297 . split ( '\n' )
288298 . map ( ( row ) =>
289299 row . slice ( 1 , row . length - 1 ) . split ( '::' ) ) ;
290- addEmoji ( state . name , emojiFromContent ( contentLines ) ) ;
300+ await addEmoji ( state . name , emojiFromContent ( contentLines ) ) ;
291301 postMessage ( `大絵文字 \`!${ state . name } !\`
292302${ match . groups . content }
293303が登録されました:sushi-go-left::waiwai::saikou::chian-ga-aru::sushi-go-right:` ) ;
0 commit comments