Commit d9c2f05e authored by nanahira's avatar nanahira

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

parents 2d7f04c1 7a10f28b
......@@ -9,10 +9,12 @@
"version": "0.0.1",
"license": "UNLICENSED",
"dependencies": {
"@elastic/elasticsearch": "^7.16.0",
"@koishijs/plugin-assets-s3": "^1.0.0-beta.4",
"@nestjs/common": "^8.0.0",
"@nestjs/config": "^1.1.5",
"@nestjs/core": "^8.0.0",
"@nestjs/elasticsearch": "^8.0.0",
"@nestjs/jwt": "^8.0.0",
"@nestjs/platform-express": "^8.0.0",
"@nestjs/platform-ws": "^8.2.4",
......@@ -1905,6 +1907,25 @@
"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": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
......@@ -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": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-8.0.0.tgz",
......@@ -6636,20 +6667,6 @@
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"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": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
......@@ -6988,6 +7005,11 @@
"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": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
......@@ -10418,6 +10440,11 @@
"resolved": "https://registry.npmjs.org/schemastery/-/schemastery-2.1.2.tgz",
"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": {
"version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
......@@ -13776,6 +13803,24 @@
"@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": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
......@@ -14329,6 +14374,12 @@
"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": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-8.0.0.tgz",
......@@ -17456,13 +17507,6 @@
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"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": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
......@@ -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": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
......@@ -20358,6 +20407,11 @@
"resolved": "https://registry.npmjs.org/schemastery/-/schemastery-2.1.2.tgz",
"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": {
"version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
......
......@@ -11,6 +11,8 @@ import { JwtModule, JwtModuleOptions } from '@nestjs/jwt';
import { AuthService } from './auth/auth.service';
import { BotService } from './bot/bot.service';
import { CENTER_ACCOUNT_TOKEN } from './utility/constant';
import { ElasticsearchModule } from '@nestjs/elasticsearch';
import { AuthController } from './auth/auth.controller';
@Module({
imports: [
......@@ -19,6 +21,9 @@ import { CENTER_ACCOUNT_TOKEN } from './utility/constant';
load: [loadConfig],
isGlobal: true,
}),
ElasticsearchModule.register({
node: 'http://poi.lan:9200',
}),
KoishiModule.registerAsync({
inject: [ConfigService],
useFactory: (configService: ConfigService) => {
......@@ -55,5 +60,6 @@ import { CENTER_ACCOUNT_TOKEN } from './utility/constant';
configService.get<string>('centerAccount'),
},
],
controllers: [AuthController],
})
export class AppModule {}
......@@ -3,6 +3,7 @@ import { BotService } from '../bot/bot.service';
import { JwtService } from '@nestjs/jwt';
import { BlankReturnMessageDto } from '../dto/ReturnMessage.dto';
import { InjectCenterAccount } from '../utility/constant';
import { Bot } from 'koishi';
@Injectable()
export class AuthService extends ConsoleLogger {
......@@ -15,11 +16,34 @@ export class AuthService extends ConsoleLogger {
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) {
const bot = this.botService.getBot(selfId);
if (!bot) {
throw new BlankReturnMessageDto(404, 'Bot not found').toException();
}
await this.checkCenterFriend(bot);
try {
const code = await this.jwt.signAsync({ sub: selfId });
await bot.sendPrivateMessage(this.centerAccount, `您的密钥是:\n${code}`);
......
......@@ -13,6 +13,7 @@ async function bootstrap() {
.setTitle('momento')
.setDescription('QQ Message logger.')
.setVersion('1.0')
.addTag('Auth', '认证')
.build();
const document = SwaggerModule.createDocument(app, documentConfig);
......
......@@ -7,6 +7,7 @@ import { UseEvent, WireContextService } from 'koishi-nestjs';
import { Session } from 'koishi';
import S3Assets from '@koishijs/plugin-assets-s3';
import { InjectCenterAccount } from '../utility/constant';
import { ElasticsearchService } from '@nestjs/elasticsearch';
@Injectable()
export class MessageService
......@@ -15,6 +16,7 @@ export class MessageService
constructor(
@InjectCenterAccount()
private readonly centerAccount: string,
private readonly elasticsearchService: ElasticsearchService,
) {
super('message');
}
......@@ -27,7 +29,12 @@ export class MessageService
@UseEvent('message')
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;
}
let content = session.content;
......@@ -42,9 +49,22 @@ export class MessageService
// targetId, for private messages only
const fromId = session.userId;
const targetId = session.targetId || session.guildId;
const fromName = session.username;
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()
......
......@@ -58,7 +58,7 @@ export interface SenderInfo extends StrangerInfo {
export interface Message extends MessageId {
real_id?: number;
time: number;
message_type: 'private' | 'group';
message_type: 'private' | 'group' | 'guild';
sender: SenderInfo;
group_id?: number;
guild_id?: string;
......
......@@ -157,6 +157,7 @@ export function adaptSession(data: OneBot.Payload, bot?: OneBotBot) {
if (data.post_type === 'message' || data.post_type === 'message_sent') {
Object.assign(session, adaptMessage(data, bot));
session.type = 'message';
// @ts-ignore
session.subtype = data.message_type;
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