コメント追加したり
This commit is contained in:
parent
1c45e759c3
commit
b9575d2c5b
22 changed files with 945 additions and 809 deletions
|
@ -2,6 +2,9 @@ import { config } from '../../config';
|
|||
import { User } from '../models/entities/user';
|
||||
import { Score } from '../../common/types/score';
|
||||
|
||||
/**
|
||||
* デフォルトの投稿用テンプレート
|
||||
*/
|
||||
export const defaultTemplate = `昨日のMisskeyの活動は
|
||||
|
||||
ノート: {notesCount}({notesDelta})
|
||||
|
@ -11,11 +14,17 @@ export const defaultTemplate = `昨日のMisskeyの活動は
|
|||
でした。
|
||||
{url}`;
|
||||
|
||||
/**
|
||||
* 埋め込み変数の型
|
||||
*/
|
||||
export type Variable = {
|
||||
description?: string;
|
||||
replace?: string | ((score: Score, user: User) => string);
|
||||
};
|
||||
|
||||
/**
|
||||
* 埋め込み可能な変数のリスト
|
||||
*/
|
||||
export const variables: Record<string, Variable> = {
|
||||
notesCount: {
|
||||
description: 'ノート数',
|
||||
|
@ -61,6 +70,12 @@ export const variables: Record<string, Variable> = {
|
|||
|
||||
const variableRegex = /\{([a-zA-Z0-9_]+?)\}/g;
|
||||
|
||||
/**
|
||||
* スコア情報とユーザー情報からテキストを生成する
|
||||
* @param score スコア情報
|
||||
* @param user ユーザー情報
|
||||
* @returns 生成したテキスト
|
||||
*/
|
||||
export const format = (score: Score, user: User): string => {
|
||||
const template = user.template || defaultTemplate;
|
||||
return template.replace(variableRegex, (m, name) => {
|
||||
|
|
|
@ -2,6 +2,9 @@ import rndstr from 'rndstr';
|
|||
import { UsedToken } from '../models/entities/used-token';
|
||||
import { UsedTokens } from '../models';
|
||||
|
||||
/**
|
||||
* トークンを生成します
|
||||
*/
|
||||
export const genToken = async (): Promise<string> => {
|
||||
let used: UsedToken | undefined = undefined;
|
||||
let token: string;
|
||||
|
@ -10,4 +13,4 @@ export const genToken = async (): Promise<string> => {
|
|||
used = await UsedTokens.findOne({ token });
|
||||
} while (used !== undefined);
|
||||
return token;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -3,6 +3,11 @@ import { Score } from '../../common/types/score';
|
|||
import { api } from '../services/misskey';
|
||||
import { toSignedString } from './to-signed-string';
|
||||
|
||||
/**
|
||||
* ユーザーのスコアを取得します。
|
||||
* @param user ユーザー
|
||||
* @returns ユーザーのスコア
|
||||
*/
|
||||
export const getScores = async (user: User): Promise<Score> => {
|
||||
const miUser = await api<Record<string, number>>(user.host, 'users/show', { username: user.username }, user.token);
|
||||
if (miUser.error) {
|
||||
|
|
|
@ -1,14 +1,19 @@
|
|||
import { Users } from '../models';
|
||||
import { User } from '../models/entities/user';
|
||||
|
||||
/**
|
||||
* ミス廃ランキングを取得する
|
||||
* @param limit 取得する件数
|
||||
* @returns ミス廃ランキング
|
||||
*/
|
||||
export const getRanking = async (limit: number | null = 10): Promise<User[]> => {
|
||||
const query = Users.createQueryBuilder('user')
|
||||
.where('"user"."bannedFromRanking" IS NOT TRUE')
|
||||
.orderBy('"user".rating', 'DESC');
|
||||
|
||||
|
||||
if (limit !== null) {
|
||||
query.limit(limit);
|
||||
}
|
||||
|
||||
|
||||
return await query.getMany();
|
||||
};
|
||||
};
|
||||
|
|
|
@ -1 +1,6 @@
|
|||
/**
|
||||
* 数値を符号付き数値の文字列に変換する
|
||||
* @param num 数値
|
||||
* @returns 符号付き数値の文字列
|
||||
*/
|
||||
export const toSignedString = (num: number): string => num < 0 ? num.toString() : '+' + num;
|
||||
|
|
|
@ -4,6 +4,11 @@ import { User } from '../models/entities/user';
|
|||
import { updateUser } from './users';
|
||||
import { MiUser } from './update-score';
|
||||
|
||||
/**
|
||||
* ユーザーのレーティングを更新します
|
||||
* @param user ユーザー
|
||||
* @param miUser Misskeyのユーザー
|
||||
*/
|
||||
export const updateRating = async (user: User, miUser: MiUser): Promise<void> => {
|
||||
const elapsedDays = dayjs().diff(dayjs(miUser.createdAt), 'd') + 1;
|
||||
await updateUser(user.username, user.host, {
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
import { User } from '../models/entities/user';
|
||||
import { updateUser } from './users';
|
||||
|
||||
/**
|
||||
* Misskeyのユーザーモデル
|
||||
*/
|
||||
export type MiUser = {
|
||||
notesCount: number,
|
||||
followingCount: number,
|
||||
|
@ -8,10 +11,15 @@ export type MiUser = {
|
|||
createdAt: string,
|
||||
};
|
||||
|
||||
export const updateScore = async (user: User, miUser: MiUser): Promise<void> => {
|
||||
/**
|
||||
* スコアを更新します
|
||||
* @param user ユーザー
|
||||
* @param miUser Misskeyのユーザー
|
||||
*/
|
||||
export const updateScore = async (user: User, miUser: MiUser): Promise<void> => {
|
||||
await updateUser(user.username, user.host, {
|
||||
prevNotesCount: miUser.notesCount ?? 0,
|
||||
prevFollowingCount: miUser.followingCount ?? 0,
|
||||
prevFollowersCount: miUser.followersCount ?? 0,
|
||||
});
|
||||
};
|
||||
};
|
||||
|
|
|
@ -2,26 +2,47 @@ import { User } from '../models/entities/user';
|
|||
import { Users } from '../models';
|
||||
import { DeepPartial } from 'typeorm';
|
||||
import { genToken } from './gen-token';
|
||||
import pick from 'object.pick';
|
||||
|
||||
/**
|
||||
* ユーザーを取得します
|
||||
* @param username ユーザー名
|
||||
* @param host ホスト名
|
||||
* @returns ユーザー
|
||||
*/
|
||||
export const getUser = (username: string, host: string): Promise<User | undefined> => {
|
||||
return Users.findOne({ username, host });
|
||||
};
|
||||
|
||||
/**
|
||||
* ユーザーのミス廃トークンを更新します。
|
||||
* @param user ユーザー
|
||||
* @returns ミス廃トークン
|
||||
*/
|
||||
export const updateUsersMisshaiToken = async (user: User | User['id']): Promise<string> => {
|
||||
const u = typeof user === 'number'
|
||||
const u = typeof user === 'number'
|
||||
? user
|
||||
: user.id;
|
||||
|
||||
|
||||
const misshaiToken = await genToken();
|
||||
Users.update(u, { misshaiToken });
|
||||
return misshaiToken;
|
||||
return misshaiToken;
|
||||
};
|
||||
|
||||
/**
|
||||
* ミス廃トークンからユーザーを取得します。
|
||||
* @param token ミス廃トークン
|
||||
* @returns ユーザー
|
||||
*/
|
||||
export const getUserByMisshaiToken = (token: string): Promise<User | undefined> => {
|
||||
return Users.findOne({ misshaiToken: token });
|
||||
};
|
||||
|
||||
/**
|
||||
* ユーザー情報を更新するか新規作成します。
|
||||
* @param username ユーザー名
|
||||
* @param host ホスト名
|
||||
* @param token トークン
|
||||
*/
|
||||
export const upsertUser = async (username: string, host: string, token: string): Promise<void> => {
|
||||
const u = await getUser(username, host);
|
||||
if (u) {
|
||||
|
@ -31,14 +52,29 @@ export const upsertUser = async (username: string, host: string, token: string):
|
|||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* ユーザー情報を更新します。
|
||||
* @param username ユーザー名
|
||||
* @param host ホスト名
|
||||
* @param record 既存のユーザー情報
|
||||
*/
|
||||
export const updateUser = async (username: string, host: string, record: DeepPartial<User>): Promise<void> => {
|
||||
await Users.update({ username, host }, record);
|
||||
};
|
||||
|
||||
/**
|
||||
* 指定したユーザーを削除します。
|
||||
* @param username ユーザー名
|
||||
* @param host ホスト名
|
||||
*/
|
||||
export const deleteUser = async (username: string, host: string): Promise<void> => {
|
||||
await Users.delete({ username, host });
|
||||
};
|
||||
|
||||
/**
|
||||
* ユーザー数を取得します。
|
||||
* @returns ユーザー数
|
||||
*/
|
||||
export const getUserCount = (): Promise<number> => {
|
||||
return Users.count();
|
||||
};
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue