Commit d9c2f05e authored by nanahira's avatar nanahira

Merge branch 'master' of git.mycard.moe:mycard/momento

parents 2d7f04c1 7a10f28b
...@@ -9,10 +9,12 @@ ...@@ -9,10 +9,12 @@
"version": "0.0.1", "version": "0.0.1",
"license": "UNLICENSED", "license": "UNLICENSED",
"dependencies": { "dependencies": {
"@elastic/elasticsearch": "^7.16.0",
"@koishijs/plugin-assets-s3": "^1.0.0-beta.4", "@koishijs/plugin-assets-s3": "^1.0.0-beta.4",
"@nestjs/common": "^8.0.0", "@nestjs/common": "^8.0.0",
"@nestjs/config": "^1.1.5", "@nestjs/config": "^1.1.5",
"@nestjs/core": "^8.0.0", "@nestjs/core": "^8.0.0",
"@nestjs/elasticsearch": "^8.0.0",
"@nestjs/jwt": "^8.0.0", "@nestjs/jwt": "^8.0.0",
"@nestjs/platform-express": "^8.0.0", "@nestjs/platform-express": "^8.0.0",
"@nestjs/platform-ws": "^8.2.4", "@nestjs/platform-ws": "^8.2.4",
...@@ -1905,6 +1907,25 @@ ...@@ -1905,6 +1907,25 @@
"node": ">=12" "node": ">=12"
} }
}, },
"node_modules/@elastic/elasticsearch": {
"version": "7.16.0",
"resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-7.16.0.tgz",
"integrity": "sha512-lMY2MFZZFG3om7QNHninxZZOXYx3NdIUwEISZxqaI9dXPoL3DNhU31keqjvx1gN6T74lGXAzrRNP4ag8CJ/VXw==",
"dependencies": {
"debug": "^4.3.1",
"hpagent": "^0.1.1",
"ms": "^2.1.3",
"secure-json-parse": "^2.4.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/@elastic/elasticsearch/node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
"node_modules/@eslint/eslintrc": { "node_modules/@eslint/eslintrc": {
"version": "0.4.3", "version": "0.4.3",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
...@@ -2630,6 +2651,16 @@ ...@@ -2630,6 +2651,16 @@
} }
} }
}, },
"node_modules/@nestjs/elasticsearch": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@nestjs/elasticsearch/-/elasticsearch-8.0.0.tgz",
"integrity": "sha512-Yr0DldZA2pZGAF77R7CDClbXJd6cKctI5zgFc/6vFARjaHhRwETyeTES/nRiQLCZ+hfWmpRyvu1YX3reNMqW6A==",
"peerDependencies": {
"@elastic/elasticsearch": "^7.4.0",
"@nestjs/common": "^6.0.0 || ^7.0.0 || ^8.0.0",
"rxjs": "^6.2.1 || ^7.2.0"
}
},
"node_modules/@nestjs/jwt": { "node_modules/@nestjs/jwt": {
"version": "8.0.0", "version": "8.0.0",
"resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-8.0.0.tgz", "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-8.0.0.tgz",
...@@ -6636,20 +6667,6 @@ ...@@ -6636,20 +6667,6 @@
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
}, },
"node_modules/fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
"hasInstallScript": true,
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/fstream": { "node_modules/fstream": {
"version": "1.0.12", "version": "1.0.12",
"resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
...@@ -6988,6 +7005,11 @@ ...@@ -6988,6 +7005,11 @@
"safe-buffer": "~5.2.0" "safe-buffer": "~5.2.0"
} }
}, },
"node_modules/hpagent": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/hpagent/-/hpagent-0.1.2.tgz",
"integrity": "sha512-ePqFXHtSQWAFXYmj+JtOTHr84iNrII4/QRlAAPPE+zqnKy4xJo7Ie1Y4kC7AdB+LxLxSTTzBMASsEcy0q8YyvQ=="
},
"node_modules/html-encoding-sniffer": { "node_modules/html-encoding-sniffer": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
...@@ -10418,6 +10440,11 @@ ...@@ -10418,6 +10440,11 @@
"resolved": "https://registry.npmjs.org/schemastery/-/schemastery-2.1.2.tgz", "resolved": "https://registry.npmjs.org/schemastery/-/schemastery-2.1.2.tgz",
"integrity": "sha512-iHwWfKxWaTFgZmKNULNtgyo8VDpdEWx31b6+j0tGTST8dBIYU7VYAHmq5qdYKYZ0uNSM5u57c09cuN75Yf7WwQ==" "integrity": "sha512-iHwWfKxWaTFgZmKNULNtgyo8VDpdEWx31b6+j0tGTST8dBIYU7VYAHmq5qdYKYZ0uNSM5u57c09cuN75Yf7WwQ=="
}, },
"node_modules/secure-json-parse": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.4.0.tgz",
"integrity": "sha512-Q5Z/97nbON5t/L/sH6mY2EacfjVGwrCcSi5D3btRO2GZ8pf1K1UN7Z9H5J57hjVU2Qzxr1xO+FmBhOvEkzCMmg=="
},
"node_modules/semver": { "node_modules/semver": {
"version": "7.3.5", "version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
...@@ -13776,6 +13803,24 @@ ...@@ -13776,6 +13803,24 @@
"@cspotcode/source-map-consumer": "0.8.0" "@cspotcode/source-map-consumer": "0.8.0"
} }
}, },
"@elastic/elasticsearch": {
"version": "7.16.0",
"resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-7.16.0.tgz",
"integrity": "sha512-lMY2MFZZFG3om7QNHninxZZOXYx3NdIUwEISZxqaI9dXPoL3DNhU31keqjvx1gN6T74lGXAzrRNP4ag8CJ/VXw==",
"requires": {
"debug": "^4.3.1",
"hpagent": "^0.1.1",
"ms": "^2.1.3",
"secure-json-parse": "^2.4.0"
},
"dependencies": {
"ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
}
}
},
"@eslint/eslintrc": { "@eslint/eslintrc": {
"version": "0.4.3", "version": "0.4.3",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
...@@ -14329,6 +14374,12 @@ ...@@ -14329,6 +14374,12 @@
"uuid": "8.3.2" "uuid": "8.3.2"
} }
}, },
"@nestjs/elasticsearch": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@nestjs/elasticsearch/-/elasticsearch-8.0.0.tgz",
"integrity": "sha512-Yr0DldZA2pZGAF77R7CDClbXJd6cKctI5zgFc/6vFARjaHhRwETyeTES/nRiQLCZ+hfWmpRyvu1YX3reNMqW6A==",
"requires": {}
},
"@nestjs/jwt": { "@nestjs/jwt": {
"version": "8.0.0", "version": "8.0.0",
"resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-8.0.0.tgz", "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-8.0.0.tgz",
...@@ -17456,13 +17507,6 @@ ...@@ -17456,13 +17507,6 @@
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
}, },
"fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
"optional": true
},
"fstream": { "fstream": {
"version": "1.0.12", "version": "1.0.12",
"resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
...@@ -17715,6 +17759,11 @@ ...@@ -17715,6 +17759,11 @@
} }
} }
}, },
"hpagent": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/hpagent/-/hpagent-0.1.2.tgz",
"integrity": "sha512-ePqFXHtSQWAFXYmj+JtOTHr84iNrII4/QRlAAPPE+zqnKy4xJo7Ie1Y4kC7AdB+LxLxSTTzBMASsEcy0q8YyvQ=="
},
"html-encoding-sniffer": { "html-encoding-sniffer": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
...@@ -20358,6 +20407,11 @@ ...@@ -20358,6 +20407,11 @@
"resolved": "https://registry.npmjs.org/schemastery/-/schemastery-2.1.2.tgz", "resolved": "https://registry.npmjs.org/schemastery/-/schemastery-2.1.2.tgz",
"integrity": "sha512-iHwWfKxWaTFgZmKNULNtgyo8VDpdEWx31b6+j0tGTST8dBIYU7VYAHmq5qdYKYZ0uNSM5u57c09cuN75Yf7WwQ==" "integrity": "sha512-iHwWfKxWaTFgZmKNULNtgyo8VDpdEWx31b6+j0tGTST8dBIYU7VYAHmq5qdYKYZ0uNSM5u57c09cuN75Yf7WwQ=="
}, },
"secure-json-parse": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.4.0.tgz",
"integrity": "sha512-Q5Z/97nbON5t/L/sH6mY2EacfjVGwrCcSi5D3btRO2GZ8pf1K1UN7Z9H5J57hjVU2Qzxr1xO+FmBhOvEkzCMmg=="
},
"semver": { "semver": {
"version": "7.3.5", "version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
......
...@@ -21,11 +21,13 @@ ...@@ -21,11 +21,13 @@
"test:e2e": "jest --config ./test/jest-e2e.json" "test:e2e": "jest --config ./test/jest-e2e.json"
}, },
"dependencies": { "dependencies": {
"@elastic/elasticsearch": "^7.16.0",
"@koishijs/plugin-assets-s3": "^1.0.0-beta.4", "@koishijs/plugin-assets-s3": "^1.0.0-beta.4",
"@nestjs/common": "^8.0.0", "@nestjs/common": "^8.0.0",
"@nestjs/config": "^1.1.5", "@nestjs/config": "^1.1.5",
"@nestjs/core": "^8.0.0", "@nestjs/core": "^8.0.0",
"@nestjs/jwt": "^8.0.0", "@nestjs/jwt": "^8.0.0",
"@nestjs/elasticsearch": "^8.0.0",
"@nestjs/platform-express": "^8.0.0", "@nestjs/platform-express": "^8.0.0",
"@nestjs/platform-ws": "^8.2.4", "@nestjs/platform-ws": "^8.2.4",
"@nestjs/swagger": "^5.1.5", "@nestjs/swagger": "^5.1.5",
......
...@@ -11,6 +11,8 @@ import { JwtModule, JwtModuleOptions } from '@nestjs/jwt'; ...@@ -11,6 +11,8 @@ import { JwtModule, JwtModuleOptions } from '@nestjs/jwt';
import { AuthService } from './auth/auth.service'; import { AuthService } from './auth/auth.service';
import { BotService } from './bot/bot.service'; import { BotService } from './bot/bot.service';
import { CENTER_ACCOUNT_TOKEN } from './utility/constant'; import { CENTER_ACCOUNT_TOKEN } from './utility/constant';
import { ElasticsearchModule } from '@nestjs/elasticsearch';
import { AuthController } from './auth/auth.controller';
@Module({ @Module({
imports: [ imports: [
...@@ -19,6 +21,9 @@ import { CENTER_ACCOUNT_TOKEN } from './utility/constant'; ...@@ -19,6 +21,9 @@ import { CENTER_ACCOUNT_TOKEN } from './utility/constant';
load: [loadConfig], load: [loadConfig],
isGlobal: true, isGlobal: true,
}), }),
ElasticsearchModule.register({
node: 'http://poi.lan:9200',
}),
KoishiModule.registerAsync({ KoishiModule.registerAsync({
inject: [ConfigService], inject: [ConfigService],
useFactory: (configService: ConfigService) => { useFactory: (configService: ConfigService) => {
...@@ -55,5 +60,6 @@ import { CENTER_ACCOUNT_TOKEN } from './utility/constant'; ...@@ -55,5 +60,6 @@ import { CENTER_ACCOUNT_TOKEN } from './utility/constant';
configService.get<string>('centerAccount'), configService.get<string>('centerAccount'),
}, },
], ],
controllers: [AuthController],
}) })
export class AppModule {} export class AppModule {}
...@@ -3,6 +3,7 @@ import { BotService } from '../bot/bot.service'; ...@@ -3,6 +3,7 @@ import { BotService } from '../bot/bot.service';
import { JwtService } from '@nestjs/jwt'; import { JwtService } from '@nestjs/jwt';
import { BlankReturnMessageDto } from '../dto/ReturnMessage.dto'; import { BlankReturnMessageDto } from '../dto/ReturnMessage.dto';
import { InjectCenterAccount } from '../utility/constant'; import { InjectCenterAccount } from '../utility/constant';
import { Bot } from 'koishi';
@Injectable() @Injectable()
export class AuthService extends ConsoleLogger { export class AuthService extends ConsoleLogger {
...@@ -15,11 +16,34 @@ export class AuthService extends ConsoleLogger { ...@@ -15,11 +16,34 @@ export class AuthService extends ConsoleLogger {
super('AuthService'); super('AuthService');
} }
private async checkCenterFriend(bot: Bot) {
let friends: Bot.User[];
try {
friends = await bot.getFriendList();
} catch (e) {
this.error(`Failed to get friend list of ${bot.selfId}: ${e.message}`);
throw new BlankReturnMessageDto(
500,
'Failed fetching friend list.',
).toException();
}
const centerFriend = friends?.find(
(friend) => friend.userId === this.centerAccount,
);
if (!centerFriend) {
throw new BlankReturnMessageDto(
404,
'Center account is not a friend.',
).toException();
}
}
async sendCode(selfId: string) { async sendCode(selfId: string) {
const bot = this.botService.getBot(selfId); const bot = this.botService.getBot(selfId);
if (!bot) { if (!bot) {
throw new BlankReturnMessageDto(404, 'Bot not found').toException(); throw new BlankReturnMessageDto(404, 'Bot not found').toException();
} }
await this.checkCenterFriend(bot);
try { try {
const code = await this.jwt.signAsync({ sub: selfId }); const code = await this.jwt.signAsync({ sub: selfId });
await bot.sendPrivateMessage(this.centerAccount, `您的密钥是:\n${code}`); await bot.sendPrivateMessage(this.centerAccount, `您的密钥是:\n${code}`);
......
...@@ -13,6 +13,7 @@ async function bootstrap() { ...@@ -13,6 +13,7 @@ async function bootstrap() {
.setTitle('momento') .setTitle('momento')
.setDescription('QQ Message logger.') .setDescription('QQ Message logger.')
.setVersion('1.0') .setVersion('1.0')
.addTag('Auth', '认证')
.build(); .build();
const document = SwaggerModule.createDocument(app, documentConfig); const document = SwaggerModule.createDocument(app, documentConfig);
......
...@@ -7,6 +7,7 @@ import { UseEvent, WireContextService } from 'koishi-nestjs'; ...@@ -7,6 +7,7 @@ import { UseEvent, WireContextService } from 'koishi-nestjs';
import { Session } from 'koishi'; import { Session } from 'koishi';
import S3Assets from '@koishijs/plugin-assets-s3'; import S3Assets from '@koishijs/plugin-assets-s3';
import { InjectCenterAccount } from '../utility/constant'; import { InjectCenterAccount } from '../utility/constant';
import { ElasticsearchService } from '@nestjs/elasticsearch';
@Injectable() @Injectable()
export class MessageService export class MessageService
...@@ -15,6 +16,7 @@ export class MessageService ...@@ -15,6 +16,7 @@ export class MessageService
constructor( constructor(
@InjectCenterAccount() @InjectCenterAccount()
private readonly centerAccount: string, private readonly centerAccount: string,
private readonly elasticsearchService: ElasticsearchService,
) { ) {
super('message'); super('message');
} }
...@@ -27,7 +29,12 @@ export class MessageService ...@@ -27,7 +29,12 @@ export class MessageService
@UseEvent('message') @UseEvent('message')
async onMessage(session: Session) { async onMessage(session: Session) {
if (session.targetId === this.centerAccount) { if (
session.targetId === this.centerAccount ||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
session.subtype === 'guild'
) {
return; return;
} }
let content = session.content; let content = session.content;
...@@ -42,9 +49,22 @@ export class MessageService ...@@ -42,9 +49,22 @@ export class MessageService
// targetId, for private messages only // targetId, for private messages only
const fromId = session.userId; const fromId = session.userId;
const targetId = session.targetId || session.guildId; const targetId = session.targetId || session.guildId;
const fromName = session.username;
this.log( this.log(
`Received message from ${session.username}(${fromId}) to ${targetId}: ${content}`, `Received message from ${fromName}(${fromId}) to ${targetId}: ${content}`,
); );
await this.elasticsearchService.index({
index: session.selfId,
body: {
selfId: session.selfId,
type: session.subtype as string,
fromId,
fromName,
targetId,
content,
},
});
} }
@WireContextService() @WireContextService()
......
...@@ -58,7 +58,7 @@ export interface SenderInfo extends StrangerInfo { ...@@ -58,7 +58,7 @@ export interface SenderInfo extends StrangerInfo {
export interface Message extends MessageId { export interface Message extends MessageId {
real_id?: number; real_id?: number;
time: number; time: number;
message_type: 'private' | 'group'; message_type: 'private' | 'group' | 'guild';
sender: SenderInfo; sender: SenderInfo;
group_id?: number; group_id?: number;
guild_id?: string; guild_id?: string;
......
...@@ -157,6 +157,7 @@ export function adaptSession(data: OneBot.Payload, bot?: OneBotBot) { ...@@ -157,6 +157,7 @@ export function adaptSession(data: OneBot.Payload, bot?: OneBotBot) {
if (data.post_type === 'message' || data.post_type === 'message_sent') { if (data.post_type === 'message' || data.post_type === 'message_sent') {
Object.assign(session, adaptMessage(data, bot)); Object.assign(session, adaptMessage(data, bot));
session.type = 'message'; session.type = 'message';
// @ts-ignore
session.subtype = data.message_type; session.subtype = data.message_type;
return session; return session;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment