style: some strings
This commit is contained in:
parent
50df8a2e6d
commit
d0a95f4eac
@ -18,7 +18,7 @@ export const api = async <T extends Record<string, unknown> = Record<string, unk
|
||||
try {
|
||||
data = await axios.post<T>(`https://${host}/api/${endpoint}`, a).then(res => res.data);
|
||||
} catch (e) {
|
||||
printLog(`接続エラー: ${host}/api/${endpoint} リトライ中 (${i + 1} / ${RETRY_COUNT})\n${e}`, 'error');
|
||||
printLog(`전송 오류: ${host}/api/${endpoint} - 재시도 중 (${i + 1} / ${RETRY_COUNT})\n${e}`, 'error');
|
||||
await delay(3000);
|
||||
continue;
|
||||
}
|
||||
|
@ -51,8 +51,8 @@ export const sendNoteAlert = async (text: string, user: User) => {
|
||||
*/
|
||||
export const sendNotificationAlert = async (text: string, user: User) => {
|
||||
const res = await api(user.host, 'notifications/create', {
|
||||
header: 'Misskey Tools',
|
||||
icon: 'https://i.imgur.com/B991yTl.png',
|
||||
header: 'Misskey Tools on phater.live',
|
||||
icon: 'https://on.phater.live/logo.png',
|
||||
body: text,
|
||||
}, user.token);
|
||||
|
||||
|
@ -34,16 +34,16 @@ export const work = async () => {
|
||||
const users = await Users.find();
|
||||
const groupedUsers = groupBy(users, u => u.host);
|
||||
|
||||
printLog(`${users.length} アカウントのレート計算を開始します。`);
|
||||
printLog(`${users.length}개의 계정을 발견, 레이팅을 계산하고 있습니다.`);
|
||||
await calculateAllRating(groupedUsers);
|
||||
Store.dispatch({ nowCalculating: false });
|
||||
|
||||
printLog(`${users.length} アカウントのアラート送信を開始します。`);
|
||||
printLog(`${users.length}개의 계정 레이팅 계산 완료, 알림을 전송하고 있습니다.`);
|
||||
await sendAllAlerts(groupedUsers);
|
||||
|
||||
printLog('ミス廃アラートワーカーは正常に完了しました。');
|
||||
printLog('Misskey Tools on phater.live 알림 전송이 완료되었습니다.');
|
||||
} catch (e) {
|
||||
printLog('ミス廃アラートワーカーが異常終了しました。', 'error');
|
||||
printLog('Misskey Tools on phater.live 알림 전송에 실패했습니다.', 'error');
|
||||
printLog(e instanceof Error ? errorToString(e) : JSON.stringify(e, null, ' '), 'error');
|
||||
} finally {
|
||||
Store.dispatch({ nowCalculating: false });
|
||||
@ -61,21 +61,21 @@ const calculateRating = async (host: string, users: User[]) => {
|
||||
miUser = await api<MiUser>(user.host, 'i', {}, user.token);
|
||||
} catch (e) {
|
||||
if (!(e instanceof Error)) {
|
||||
printLog('バグ:エラーオブジェクトはErrorを継承していないといけない', 'error');
|
||||
printLog('문제 발생: 오류 객체는 Error를 상속하지 않아야 합니다.', 'error');
|
||||
} else if (e instanceof MisskeyError) {
|
||||
if (ERROR_CODES_USER_REMOVED.includes(e.error.code)) {
|
||||
// ユーザーが削除されている場合、レコードからも消してとりやめ
|
||||
printLog(`アカウント ${toAcct(user)} は削除されているか、凍結されているか、トークンを失効しています。そのため、本システムからアカウントを削除します。`, 'warn');
|
||||
printLog(`${toAcct(user)} 게정이 삭제, 정지, 또는 토큰이 제거된 것으로 보이며, 시스템에서 계정이 제거되었습니다.`, 'warn');
|
||||
await deleteUser(user.username, user.host);
|
||||
} else {
|
||||
printLog(`Misskey エラー: ${JSON.stringify(e.error)}`, 'error');
|
||||
printLog(`Misskey 오류: ${JSON.stringify(e.error)}`, 'error');
|
||||
}
|
||||
} else if (e instanceof TimedOutError) {
|
||||
printLog(`サーバー ${user.host} との接続に失敗したため、このサーバーのレート計算を中断します。`, 'error');
|
||||
printLog(`${user.host} 인스턴스로의 연결에 실패하여 레이팅 계산을 중단합니다.`, 'error');
|
||||
return;
|
||||
} else {
|
||||
// おそらく通信エラー
|
||||
printLog(`不明なエラーが発生しました。\n${errorToString(e)}`, 'error');
|
||||
printLog(`알 수 없는 오류가 발생했습니다.\n${errorToString(e)}`, 'error');
|
||||
}
|
||||
continue;
|
||||
}
|
||||
@ -83,7 +83,7 @@ const calculateRating = async (host: string, users: User[]) => {
|
||||
|
||||
await updateRating(user, miUser);
|
||||
}
|
||||
printLog(`${host} ユーザー(${users.length}人) のレート計算が完了しました。`);
|
||||
printLog(`${host} 인스턴스의 사용자 ${users.length}명의 레이팅 계산이 완료되었습니다.`);
|
||||
};
|
||||
|
||||
const sendAllAlerts = async (groupedUsers: [string, User[]][]) => {
|
||||
@ -125,5 +125,5 @@ const sendAlerts = async (host: string, users: User[]) => {
|
||||
]);
|
||||
}
|
||||
|
||||
printLog(`${host} ユーザー(${users.length}人) へのアラート送信が完了しました。`);
|
||||
printLog(`${host} 인스턴스의 사용자 ${users.length}명의 알림 전송이 완료되었습니다.`);
|
||||
};
|
||||
|
@ -137,7 +137,7 @@
|
||||
"_template": {
|
||||
"description": "전송되는 알림의 내용을 수정할 수 있습니다.",
|
||||
"description2": "'#misshaialert' 해시태그가 자동으로 맨 아래에 추가됩니다.",
|
||||
"default": "어제의 제 Misskey 사용량을 공개합니다!\n\n노트: {notesCount}({notesDelta})\n팔로우 : {followingCount}({followingDelta})\n팔로워 :{followersCount}({followersDelta})\n\n같이 [참여]({url})해보지 않으실래요?",
|
||||
"default": "어제의 제 Misskey 사용량을 공개합니다!\n\n노트 : {notesCount} ({notesDelta})\n팔로잉 : {followingCount} ({followingDelta})\n팔로워 : {followersCount} ({followersDelta})\n\n같이 [참여]({url})해보지 않으실래요?",
|
||||
"insertVariables": "변수 추가하기",
|
||||
"insertVariablesHelp": "{ } 으로 감싼 문자열은 변수라고 하며 특별한 기능을 가집니다. 변수는 알림을 전송할 때 자동으로 변환됩니다.",
|
||||
"_variables": {
|
||||
@ -158,34 +158,34 @@
|
||||
"sorry": "문제가 발생했습니다. 잠시 후 다시 시도해주세요.",
|
||||
"additionalInfo": "추가 정보: ",
|
||||
"hitorisskeyIsDenied": "Hitorisskey는 연동할 수 없습니다.",
|
||||
"teapot": "I'm a teapot.",
|
||||
"sessionRequired": "세션이 누락되었습니다.",
|
||||
"tokenRequired": "토큰이 누락되었습니다.",
|
||||
"invalidParameter": "매개변수가 올바르지 않습니다.",
|
||||
"notAuthorized": "권한이 없습니다.",
|
||||
"hostNotFound": "인스턴스에 접속할 수 없습니다. 호스트명이 올바른지, 인스턴스가 정상적으로 동작하는지 확인해 주세요.",
|
||||
"teapot": "나는야 찻주전자",
|
||||
"sessionRequired": "잘못된 세션이거나, 세션이 존재하지 않습니다.",
|
||||
"tokenRequired": "잘못된 토큰이거나, 세션이 존재하지 않습니다.",
|
||||
"invalidParameter": "잘못된 요청 내용입니다. 값을 확인 후 다시 시도하세요.",
|
||||
"notAuthorized": "이 리소스에 접근할 권한이 없습니다.",
|
||||
"hostNotFound": "인스턴스에 접속할 수 없습니다. 입력한 인스턴스 주소가 올바른지, API 요청이 가능한지 확인해주세요.",
|
||||
"other": "알 수 없는 오류가 발생했습니다. Mastodon 인스턴스로 로그인을 시도했을 수 있습니다."
|
||||
},
|
||||
"_sendTest": {
|
||||
"title": "테스트 알림을 보내시겠습니까?",
|
||||
"message": "현재 설정으로 알림을 보냅니다. 보내기 전에 설정을 저장했는지 다시 한번 확인해 주세요.",
|
||||
"message": "현재 '저장되어 있는' 설정으로 알림을 보냅니다. 변경한 내용이 있다면 먼저 설정을 저장해주세요.",
|
||||
"yes": "보내기",
|
||||
"no": "취소",
|
||||
"success": "보냈습니다.",
|
||||
"failure": "보내지 못했습니다."
|
||||
"no": "취소하기",
|
||||
"success": "테스트 알림을 전송했습니다!",
|
||||
"failure": "테스트 알림 전송에 실패했습니다. 관리자에게 문의하세요."
|
||||
},
|
||||
"_logout": {
|
||||
"title": "로그아웃하시겠습니까?",
|
||||
"message": "로그아웃하더라도 알림 송신과 Misskey 계정 정보 수집은 정지되지 않습니다. Misskey Tools를 더 이상 이용하지 않으시려면 '계정 연동을 해제하기'를 눌러 주세요.",
|
||||
"yes": "로그아웃",
|
||||
"no": "취소"
|
||||
"message": "로그아웃하더라도 알림 송신과 Misskey 계정 정보 수집은 계속 진행됩니다. Misskey Tools를 더 이상 이용하지 않으시려면 계정 연동을 해제해주세요.",
|
||||
"yes": "로그아웃하기",
|
||||
"no": "취소하기"
|
||||
},
|
||||
"_deactivate": {
|
||||
"title": "계정 연동을 해제하시겠습니까?",
|
||||
"message": "수집된 데이터나 개인 설정 등을 비롯한 모든 데이터가 삭제됩니다. 이 작업은 취소할 수 없습니다.",
|
||||
"yes": "해제하기",
|
||||
"no": "취소",
|
||||
"success": "계정 연동을 해제했습니다. 메인 화면으로 돌아갑니다.",
|
||||
"yes": "연동 해제하기",
|
||||
"no": "취소하기",
|
||||
"success": "계정 연동이 해제되었으며, 데이터가 모두 제거되었습니다. 안녕히 가세요!",
|
||||
"failure": "계정 연동을 해제할 수 없습니다."
|
||||
}
|
||||
}
|
||||
|
@ -133,22 +133,22 @@ export const AdminPage: React.VFC = () => {
|
||||
<div className="fade vstack">
|
||||
{
|
||||
!data.isAdmin ? (
|
||||
<p>You are not an administrator and cannot open this page.</p>
|
||||
<p>이 리소스에 접근할 권한이 없습니다.</p>
|
||||
) : (
|
||||
<>
|
||||
<div className="card shadow-2">
|
||||
<div className="body">
|
||||
<h1>Announcements</h1>
|
||||
<h1>공지사항</h1>
|
||||
{!isEditMode && (
|
||||
<label className="input-switch mb-2">
|
||||
<input type="checkbox" checked={isDeleteMode} onChange={e => setDeleteMode(e.target.checked)}/>
|
||||
<div className="switch"></div>
|
||||
<span>Delete Mode</span>
|
||||
<span>여기를 눌러 삭제 모드르 진입</span>
|
||||
</label>
|
||||
)}
|
||||
{ !isEditMode ? (
|
||||
<>
|
||||
{isDeleteMode && <div className="ml-2 text-danger">Click the item to delete.</div>}
|
||||
{isDeleteMode && <div className="ml-2 text-danger">삭제할 항목을 선택해주세요.</div>}
|
||||
<div className="large menu">
|
||||
{announcements.map(a => (
|
||||
<button className="item fluid" key={a.id} onClick={() => {
|
||||
@ -166,7 +166,7 @@ export const AdminPage: React.VFC = () => {
|
||||
{!isDeleteMode && (
|
||||
<button className="item fluid" onClick={() => setEditMode(true)}>
|
||||
<i className="icon fas fa-plus" />
|
||||
Create New
|
||||
새로운 공지사항 만들기
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
@ -174,34 +174,34 @@ export const AdminPage: React.VFC = () => {
|
||||
) : (
|
||||
<div className="vstack">
|
||||
<label className="input-field">
|
||||
Title
|
||||
제목
|
||||
<input type="text" value={draftTitle} onChange={e => setDraftTitle(e.target.value)} />
|
||||
</label>
|
||||
<label className="input-field">
|
||||
Body
|
||||
내용
|
||||
<textarea className="input-field" value={draftBody} rows={10} onChange={e => setDraftBody(e.target.value)}/>
|
||||
</label>
|
||||
<div className="hstack" style={{justifyContent: 'flex-end'}}>
|
||||
<button className="btn primary" onClick={submitAnnouncement} disabled={!draftTitle || !draftBody}>
|
||||
Submit
|
||||
완료
|
||||
</button>
|
||||
<button className="btn" onClick={() => {
|
||||
selectAnnouncement(null);
|
||||
setEditMode(false);
|
||||
}}>
|
||||
Cancel
|
||||
취소
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<h2>Misshai</h2>
|
||||
<h2>노트왕 알림</h2>
|
||||
<div className="vstack">
|
||||
<button className="btn danger" onClick={onClickStartMisshaiAlertWorkerButton}>
|
||||
ミス廃アラートワーカーを強制起動する
|
||||
Misskey Tools 알림을 지금 전송하기
|
||||
</button>
|
||||
<h3>直近のワーカーエラー</h3>
|
||||
<h3>최근 알림 프로세스의 기록</h3>
|
||||
{misshaiLog && <LogView log={misshaiLog} />}
|
||||
</div>
|
||||
</>
|
||||
|
@ -51,14 +51,12 @@ export const IndexSessionPage: React.VFC = () => {
|
||||
<td>{score.data?.followersCount ?? '...'}</td>
|
||||
<td>{score.data?.followersDelta ?? '...'}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{t('_missHai.rating')}</td>
|
||||
<td>{session.data.rating}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>
|
||||
<strong>
|
||||
{t('_missHai.rating')}{': '}
|
||||
</strong>
|
||||
{session?.rating ?? '...'}
|
||||
</p>
|
||||
</section>
|
||||
<section className="developerInfo">
|
||||
<h2><i className="fas fa-circle-question"></i> {t('_developerInfo.title')}</h2>
|
||||
|
Loading…
Reference in New Issue
Block a user