diff --git a/src/server/router.ts b/src/server/router.ts index 78fdecc..89d838b 100644 --- a/src/server/router.ts +++ b/src/server/router.ts @@ -11,6 +11,7 @@ import { api, apiAvailable } from '../services/misskey'; import { getScores } from '../functions/get-scores'; import { AlertMode, alertModes } from '../types/AlertMode'; import { Users } from '../models'; +import { send } from '../services/send'; export const router = new Router(); @@ -64,12 +65,14 @@ router.get('/', async ctx => { user, usersCount: await getUserCount(), score: await getScores(user), + from: ctx.query.from, }); } else { // 非ログイン await ctx.render('welcome', { usersCount: await getUserCount(), welcomeMessage: welcomeMessage[Math.floor(Math.random() * welcomeMessage.length)], + from: ctx.query.from, }); } }); @@ -117,42 +120,6 @@ router.get('/login', async ctx => { } }); -router.get('/logout', async ctx => { - const token = ctx.cookies.get('token'); - if (!token) { - await die(ctx, 'ログインしていません'); - return; - } - ctx.cookies.set('token', ''); - await ctx.render('welcome', { - usersCount: await getUserCount(), - welcomeMessage: 'ログアウトしました。', - }); -}); - -router.get('/optout', async ctx => { - const token = ctx.cookies.get('token'); - if (!token) { - await die(ctx, 'ログインしていません'); - return; - } - ctx.cookies.set('token', ''); - - const u = await getUserByMisshaiToken(token); - - if (!u) { - await die(ctx); - return; - } - - await deleteUser(u.username, u.host); - - await ctx.render('welcome', { - usersCount: await getUserCount(), - welcomeMessage: '連携を解除しました。', - }); -}); - router.get('/terms', async ctx => { await ctx.render('term'); }); @@ -242,7 +209,56 @@ router.post('/update-settings', async ctx => { await Users.update(u.id, { alertMode: mode }); - ctx.redirect('/'); + ctx.redirect('/?from=updateSettings'); +}); + + + +router.post('/logout', async ctx => { + const token = ctx.cookies.get('token'); + if (!token) { + await die(ctx, 'ログインしていません'); + return; + } + ctx.cookies.set('token', ''); + ctx.redirect('/?from=logout'); +}); + +router.post('/optout', async ctx => { + const token = ctx.cookies.get('token'); + if (!token) { + await die(ctx, 'ログインしていません'); + return; + } + ctx.cookies.set('token', ''); + + const u = await getUserByMisshaiToken(token); + + if (!u) { + await die(ctx); + return; + } + + await deleteUser(u.username, u.host); + + ctx.redirect('/?from=optout'); +}); + +router.post('/send', async ctx => { + const token = ctx.cookies.get('token'); + if (!token) { + await die(ctx, 'ログインしていません'); + return; + } + + const u = await getUserByMisshaiToken(token); + + if (!u) { + await die(ctx); + return; + } + await send(u).catch(() => die(ctx)); + ctx.redirect('/?from=send'); }); diff --git a/src/services/send.ts b/src/services/send.ts new file mode 100644 index 0000000..98621dd --- /dev/null +++ b/src/services/send.ts @@ -0,0 +1,30 @@ +import { User } from '../models/entities/user'; +import { format } from '../functions/format'; +import { getScores } from '../functions/get-scores'; +import { api } from './misskey'; + +export const send = async (user: User): Promise => { + const text = format(await getScores(user)); + + if (user.alertMode === 'note') { + console.info(`send ${user.username}@${user.host}'s misshaialert as a note`); + const res = await api>(user.host, 'notes/create', { + text, + }, user.token); + if (res.error) { + throw res.error; + } + } else if (user.alertMode === 'notification') { + console.log(`send ${user.username}@${user.host}'s misshaialert as a notification`); + const res = await api(user.host, 'notifications/create', { + header: 'みす廃あらーと', + icon: 'https://i.imgur.com/B991yTl.png', + body: text, + }, user.token); + if (res.error) { + throw res.error; + } + } else { + console.info(`will not send ${user.username}@${user.host}'s misshaialert`); + } +}; \ No newline at end of file diff --git a/src/services/worker.ts b/src/services/worker.ts index a939c2a..3976df4 100644 --- a/src/services/worker.ts +++ b/src/services/worker.ts @@ -7,6 +7,7 @@ import { format } from '../functions/format'; import { deleteUser } from '../functions/users'; import { updateScore } from '../functions/update-score'; import { getScores } from '../functions/get-scores'; +import { send } from './send'; export default (): void => { cron.schedule('0 0 0 * * *', async () => { @@ -15,31 +16,7 @@ export default (): void => { .getMany(); for (const user of users) { try { - const text = format(await getScores(user)); - await updateScore(user); - - if (user.alertMode === 'note') { - console.info(`send ${user.username}@${user.host}'s misshaialert as a note`); - const res = await api>(user.host, 'notes/create', { - text, - }, user.token); - if (res.error) { - throw res.error; - } - break; - } else if (user.alertMode === 'notification') { - console.log(`send ${user.username}@${user.host}'s misshaialert as a notification`); - const res = await api(user.host, 'notifications/create', { - header: 'みす廃あらーと', - icon: 'https://i.imgur.com/B991yTl.png', - body: text, - }, user.token); - if (res.error) { - throw res.error; - } - } else { - console.info(`will not send ${user.username}@${user.host}'s misshaialert`); - } + await send(user); } catch (e) { if (e.code === 'NO_SUCH_USER' || e.code === 'AUTHENTICATION_FAILED') { // ユーザーが削除されている場合、レコードからも消してとりやめ @@ -51,6 +28,7 @@ export default (): void => { } finally { if (user.alertMode === 'note') await delay(3000); + await updateScore(user); } } });