Compare commits
11 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
bcc7c9b2a6 | |
|
|
4c1c2685db | |
|
|
46aee8adc2 | |
|
|
2e988702c2 | |
|
|
f0ddeb05b6 | |
|
|
7309a34319 | |
|
|
ed431fb714 | |
|
|
21589dad60 | |
|
|
7c8fc054e9 | |
|
|
562ba591d5 | |
|
|
c94cb4e795 |
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,22 @@
|
||||||
|
{
|
||||||
|
"name": "stats_bot",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"start": "sh -ac '. ../../.env; ts-node src/index'",
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"debug-level": "^3.1.2",
|
||||||
|
"input": "^1.0.1",
|
||||||
|
"mongodb": "^6.3.0",
|
||||||
|
"mongoose": "^8.1.1",
|
||||||
|
"prompt": "^1.3.0",
|
||||||
|
"telegraf": "^4.15.3",
|
||||||
|
"telegram": "^2.19.10"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,109 @@
|
||||||
|
import { Context, NarrowedContext, Telegraf } from 'telegraf';
|
||||||
|
import { message } from 'telegraf/filters';
|
||||||
|
import { ChatFromGetChat, Update } from 'telegraf/typings/core/types/typegram';
|
||||||
|
import { ioc } from './utils/ioc';
|
||||||
|
import { AudienceChangeController, audienceChangeSymbol } from './controllers/audienceChange';
|
||||||
|
import { log } from './utils/log';
|
||||||
|
|
||||||
|
export type ChannelInfo = {
|
||||||
|
chatId: number,
|
||||||
|
memberCount: number,
|
||||||
|
};
|
||||||
|
|
||||||
|
export type MessageInfo = {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
export class ChannelBot {
|
||||||
|
private readonly bot: Telegraf;
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
private readonly token: string,
|
||||||
|
) {
|
||||||
|
|
||||||
|
this.bot = new Telegraf(
|
||||||
|
process.env.TELEGRAM_BOT_TOKEN ?? '',
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public async connect(): Promise<void> {
|
||||||
|
|
||||||
|
process.once('SIGINT', () => this.bot.stop('SIGINT'));
|
||||||
|
process.once('SIGTERM', () => this.bot.stop('SIGTERM'));
|
||||||
|
|
||||||
|
this.bot.on('chat_member', this.handleChatMemberUpdate.bind(this));
|
||||||
|
|
||||||
|
this.bot.launch(
|
||||||
|
{
|
||||||
|
allowedUpdates: [
|
||||||
|
'chat_join_request',
|
||||||
|
'chat_member',
|
||||||
|
'channel_post',
|
||||||
|
'edited_channel_post',
|
||||||
|
'poll',
|
||||||
|
'poll_answer'
|
||||||
|
],
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async handleChatMemberUpdate(ctx: NarrowedContext<Context<Update>, Update.ChatMemberUpdate>): Promise<void> {
|
||||||
|
try {
|
||||||
|
log.bot.info('chat_member event', JSON.stringify(ctx.chatMember));
|
||||||
|
|
||||||
|
const change = ctx.chatMember;
|
||||||
|
const status = change.new_chat_member.status;
|
||||||
|
const statusBefore = change.old_chat_member.status;
|
||||||
|
const role = ['restricted', 'left', 'kicked'].includes(status)
|
||||||
|
? statusBefore
|
||||||
|
: status;
|
||||||
|
|
||||||
|
const ctrl = ioc.get<AudienceChangeController>(audienceChangeSymbol);
|
||||||
|
|
||||||
|
const chatMemberCount = await this.bot.telegram.getChatMembersCount(change.chat.id);
|
||||||
|
|
||||||
|
ctrl.add({
|
||||||
|
channelId: change.chat.id,
|
||||||
|
user: {
|
||||||
|
id: change.new_chat_member.user.id,
|
||||||
|
username: change.new_chat_member.user.username,
|
||||||
|
firstName: change.new_chat_member.user.first_name,
|
||||||
|
lastName: change.new_chat_member.user.last_name,
|
||||||
|
isBot: change.new_chat_member.user.is_bot,
|
||||||
|
isPremium: change.new_chat_member.user.is_premium ? true : false,
|
||||||
|
role,
|
||||||
|
},
|
||||||
|
timestamp: new Date(change.date * 1000),
|
||||||
|
status,
|
||||||
|
statusBefore,
|
||||||
|
invitedByLink: change.invite_link?.invite_link ?? undefined,
|
||||||
|
|
||||||
|
memberCountAfter: chatMemberCount,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
log.bot.error('chat member change processing error', err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async getChannelInfo(channelId: number): Promise<ChannelInfo> {
|
||||||
|
|
||||||
|
const memberCount = await this.bot.telegram.getChatMembersCount(channelId);
|
||||||
|
|
||||||
|
const info: ChatFromGetChat = await this.bot.telegram.getChat(channelId);
|
||||||
|
|
||||||
|
return {
|
||||||
|
chatId: info.id,
|
||||||
|
memberCount,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// bot.on('channel_post', async (ctx) => {
|
||||||
|
// console.log('channel_post');
|
||||||
|
// console.dir(ctx.channelPost.chat.id);
|
||||||
|
|
||||||
|
// await sendChannelStats(ctx.chat.id);
|
||||||
|
// });
|
||||||
|
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
import { AudienceChangeModel, IAudienceChange } from '../model/audienceChange';
|
||||||
|
import { IUser } from '../model/user';
|
||||||
|
import { ioc } from '../utils/ioc';
|
||||||
|
import { log } from '../utils/log';
|
||||||
|
|
||||||
|
export const audienceChangeSymbol = Symbol('audienceChange');
|
||||||
|
|
||||||
|
export class AudienceChangeController {
|
||||||
|
public static register() {
|
||||||
|
ioc.set(audienceChangeSymbol, new AudienceChangeController());
|
||||||
|
}
|
||||||
|
|
||||||
|
public async add(change: IAudienceChange): Promise<void> {
|
||||||
|
log.db.info(`inserting audience change for chat ${change.channelId} ${change.status} ${change.user.id}`);
|
||||||
|
await AudienceChangeModel.create(change);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
import mongoose from "mongoose";
|
||||||
|
|
||||||
|
export async function connect() {
|
||||||
|
const dbUri = process.env.MONGO_URI ?? '';
|
||||||
|
|
||||||
|
await mongoose.connect(dbUri);
|
||||||
|
console.log("Connected to db");
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,58 @@
|
||||||
|
import { ChannelClient } from './client';
|
||||||
|
import { ChannelBot } from './bot';
|
||||||
|
import { connect } from './database';
|
||||||
|
import { ioc } from './utils/ioc';
|
||||||
|
import { AudienceChangeController } from './controllers/audienceChange';
|
||||||
|
|
||||||
|
(async () => {
|
||||||
|
|
||||||
|
try {
|
||||||
|
await connect();
|
||||||
|
|
||||||
|
AudienceChangeController.register();
|
||||||
|
|
||||||
|
const apiId = Number(process.env.TELEGRAM_API_ID ?? '0');
|
||||||
|
const apiHash = process.env.TELEGRAM_API_HASH ?? '';
|
||||||
|
const apiSession = process.env.TELEGRAM_API_SESSION ?? '';
|
||||||
|
|
||||||
|
const botToken = process.env.TELEGRAM_BOT_TOKEN ?? '';
|
||||||
|
|
||||||
|
const channelId = Number(process.env.TELEGRAM_CHANNEL_ID ?? '0');
|
||||||
|
|
||||||
|
const client = new ChannelClient(
|
||||||
|
apiId,
|
||||||
|
apiHash,
|
||||||
|
apiSession,
|
||||||
|
);
|
||||||
|
|
||||||
|
const bot = new ChannelBot(
|
||||||
|
botToken,
|
||||||
|
);
|
||||||
|
|
||||||
|
await bot.connect();
|
||||||
|
// await client.connect();
|
||||||
|
|
||||||
|
// try {
|
||||||
|
// const messages = await client.getChannelMessages(channelId, { statsOnly: true });
|
||||||
|
// console.dir(messages);
|
||||||
|
|
||||||
|
// const users = await client.getChannelUsers(channelId);
|
||||||
|
|
||||||
|
// console.dir(users);
|
||||||
|
// }
|
||||||
|
// catch (err) {
|
||||||
|
// console.error(err);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// console.dir(await bot.getChannelInfo(channelId));
|
||||||
|
|
||||||
|
// for (const message of messages)
|
||||||
|
// console.dir(await client.getChannelMessage(channelId, message.id));
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
})()
|
||||||
|
.catch((err) => console.error);
|
||||||
|
|
||||||
|
|
@ -0,0 +1,40 @@
|
||||||
|
import mongoose from "mongoose";
|
||||||
|
|
||||||
|
import { IUser, UserSchema } from './user';
|
||||||
|
|
||||||
|
export type IAudienceChange = {
|
||||||
|
channelId: number,
|
||||||
|
|
||||||
|
user: IUser,
|
||||||
|
|
||||||
|
timestamp: Date,
|
||||||
|
status: string,
|
||||||
|
statusBefore: string,
|
||||||
|
invitedByLink: string | undefined,
|
||||||
|
|
||||||
|
memberCountAfter: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
const AudienceChangeSchema = new mongoose.Schema<IAudienceChange>(
|
||||||
|
{
|
||||||
|
channelId: { type: Number, required: true },
|
||||||
|
|
||||||
|
user: UserSchema,
|
||||||
|
|
||||||
|
timestamp: Date,
|
||||||
|
status: { type: String },
|
||||||
|
statusBefore: { type: String },
|
||||||
|
invitedByLink: { type: String },
|
||||||
|
|
||||||
|
memberCountAfter: { type: Number, required: true },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
collection: 'audienceChange',
|
||||||
|
timestamps: true,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
export const AudienceChangeModel = mongoose.model<IAudienceChange>(
|
||||||
|
'audienceChange',
|
||||||
|
AudienceChangeSchema,
|
||||||
|
);
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
import mongoose from 'mongoose';
|
||||||
|
|
||||||
|
export type IUser = {
|
||||||
|
id: number;
|
||||||
|
username: string | undefined;
|
||||||
|
firstName: string;
|
||||||
|
lastName: string | undefined;
|
||||||
|
isBot: boolean;
|
||||||
|
isPremium: boolean;
|
||||||
|
role: string; // 'member' | 'administrator' | 'creator';
|
||||||
|
}
|
||||||
|
|
||||||
|
export const UserSchema = new mongoose.Schema<IUser>(
|
||||||
|
{
|
||||||
|
id: { type: Number, required: true },
|
||||||
|
username: { type: String, required: true },
|
||||||
|
firstName: { type: String },
|
||||||
|
lastName: { type: String },
|
||||||
|
isBot: { type: Boolean, required: true },
|
||||||
|
isPremium: { type: Boolean, required: true },
|
||||||
|
role: { type: String, required: true },
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
class IOC {
|
||||||
|
private readonly items = new Map<Symbol, any>();
|
||||||
|
|
||||||
|
public set<T>(key: Symbol, obj: T): void {
|
||||||
|
this.items.set(key, obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
public get<T>(key: Symbol): T {
|
||||||
|
return this.items.get(key) as T;
|
||||||
|
}
|
||||||
|
|
||||||
|
public create<A extends any[], T extends { new(...args: A): T; }>(
|
||||||
|
key: Symbol,
|
||||||
|
...args: A
|
||||||
|
): T {
|
||||||
|
const cls = this.get(key) as { new(...args: A): T; };
|
||||||
|
return new cls(...args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const ioc = new IOC();
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
import Log from 'debug-level';
|
||||||
|
|
||||||
|
const ns = 'tgstat';
|
||||||
|
|
||||||
|
export const log = {
|
||||||
|
namespace: ns,
|
||||||
|
bot: new Log(`${ns}:bot`),
|
||||||
|
client: new Log(`${ns}:client`),
|
||||||
|
db: new Log(`${ns}:db`),
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"$schema": "node_modules/lerna/schemas/lerna-schema.json",
|
||||||
|
"version": "0.0.0"
|
||||||
|
}
|
||||||
|
|
@ -8,18 +8,12 @@
|
||||||
"name": "stats_bot",
|
"name": "stats_bot",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"workspaces": [
|
||||||
"input": "^1.0.1",
|
"apps/bot"
|
||||||
"mongodb": "^6.3.0",
|
],
|
||||||
"mongoose": "^8.1.1",
|
|
||||||
"prompt": "^1.3.0",
|
|
||||||
"telegraf": "^4.15.3",
|
|
||||||
"telegram": "^2.19.10"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/chai": "4.2.11",
|
"@types/chai": "4.2.11",
|
||||||
"@types/chai-as-promised": "7.1.2",
|
"@types/chai-as-promised": "7.1.2",
|
||||||
"@types/express": "^4.17.21",
|
|
||||||
"@types/mocha": "10.0.1",
|
"@types/mocha": "10.0.1",
|
||||||
"@types/node": "13.13.52",
|
"@types/node": "13.13.52",
|
||||||
"@types/prompt": "^1.1.8",
|
"@types/prompt": "^1.1.8",
|
||||||
|
|
@ -40,7 +34,7 @@
|
||||||
"eslint-plugin-jsx-a11y": "6.7.1",
|
"eslint-plugin-jsx-a11y": "6.7.1",
|
||||||
"eslint-plugin-mocha": "10.1.0",
|
"eslint-plugin-mocha": "10.1.0",
|
||||||
"knip": "2.14.3",
|
"knip": "2.14.3",
|
||||||
"lerna": "^7.3.0",
|
"lerna": "^7.4.2",
|
||||||
"mocha": "10.2.0",
|
"mocha": "10.2.0",
|
||||||
"mocha-each": "2.0.1",
|
"mocha-each": "2.0.1",
|
||||||
"mocha-junit-reporter": "2.0.2",
|
"mocha-junit-reporter": "2.0.2",
|
||||||
|
|
@ -52,6 +46,20 @@
|
||||||
"typescript": "4.9.5"
|
"typescript": "4.9.5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"apps/bot": {
|
||||||
|
"name": "stats_bot",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"debug-level": "^3.1.2",
|
||||||
|
"input": "^1.0.1",
|
||||||
|
"mongodb": "^6.3.0",
|
||||||
|
"mongoose": "^8.1.1",
|
||||||
|
"prompt": "^1.3.0",
|
||||||
|
"telegraf": "^4.15.3",
|
||||||
|
"telegram": "^2.19.10"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@aashutoshrathi/word-wrap": {
|
"node_modules/@aashutoshrathi/word-wrap": {
|
||||||
"version": "1.2.6",
|
"version": "1.2.6",
|
||||||
"resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
|
"resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
|
||||||
|
|
@ -2376,16 +2384,6 @@
|
||||||
"url": "https://github.com/sponsors/isaacs"
|
"url": "https://github.com/sponsors/isaacs"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@types/body-parser": {
|
|
||||||
"version": "1.19.5",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
|
|
||||||
"integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"@types/connect": "*",
|
|
||||||
"@types/node": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@types/chai": {
|
"node_modules/@types/chai": {
|
||||||
"version": "4.2.11",
|
"version": "4.2.11",
|
||||||
"resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.11.tgz",
|
"resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.11.tgz",
|
||||||
|
|
@ -2401,45 +2399,6 @@
|
||||||
"@types/chai": "*"
|
"@types/chai": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@types/connect": {
|
|
||||||
"version": "3.4.38",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
|
|
||||||
"integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"@types/node": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@types/express": {
|
|
||||||
"version": "4.17.21",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
|
|
||||||
"integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"@types/body-parser": "*",
|
|
||||||
"@types/express-serve-static-core": "^4.17.33",
|
|
||||||
"@types/qs": "*",
|
|
||||||
"@types/serve-static": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@types/express-serve-static-core": {
|
|
||||||
"version": "4.17.42",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.42.tgz",
|
|
||||||
"integrity": "sha512-ckM3jm2bf/MfB3+spLPWYPUH573plBFwpOhqQ2WottxYV85j1HQFlxmnTq57X1yHY9awZPig06hL/cLMgNWHIQ==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"@types/node": "*",
|
|
||||||
"@types/qs": "*",
|
|
||||||
"@types/range-parser": "*",
|
|
||||||
"@types/send": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@types/http-errors": {
|
|
||||||
"version": "2.0.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
|
|
||||||
"integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"node_modules/@types/json-schema": {
|
"node_modules/@types/json-schema": {
|
||||||
"version": "7.0.15",
|
"version": "7.0.15",
|
||||||
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
|
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
|
||||||
|
|
@ -2452,12 +2411,6 @@
|
||||||
"integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
|
"integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/mime": {
|
|
||||||
"version": "1.3.5",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
|
|
||||||
"integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"node_modules/@types/minimatch": {
|
"node_modules/@types/minimatch": {
|
||||||
"version": "3.0.5",
|
"version": "3.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz",
|
||||||
|
|
@ -2498,18 +2451,6 @@
|
||||||
"@types/revalidator": "*"
|
"@types/revalidator": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@types/qs": {
|
|
||||||
"version": "6.9.11",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz",
|
|
||||||
"integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"node_modules/@types/range-parser": {
|
|
||||||
"version": "1.2.7",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
|
|
||||||
"integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"node_modules/@types/revalidator": {
|
"node_modules/@types/revalidator": {
|
||||||
"version": "0.3.12",
|
"version": "0.3.12",
|
||||||
"resolved": "https://registry.npmjs.org/@types/revalidator/-/revalidator-0.3.12.tgz",
|
"resolved": "https://registry.npmjs.org/@types/revalidator/-/revalidator-0.3.12.tgz",
|
||||||
|
|
@ -2522,27 +2463,6 @@
|
||||||
"integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==",
|
"integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/send": {
|
|
||||||
"version": "0.17.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
|
|
||||||
"integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"@types/mime": "^1",
|
|
||||||
"@types/node": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@types/serve-static": {
|
|
||||||
"version": "1.15.5",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz",
|
|
||||||
"integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"@types/http-errors": "*",
|
|
||||||
"@types/mime": "*",
|
|
||||||
"@types/node": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@types/sinon": {
|
"node_modules/@types/sinon": {
|
||||||
"version": "9.0.4",
|
"version": "9.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-9.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-9.0.4.tgz",
|
||||||
|
|
@ -3046,7 +2966,6 @@
|
||||||
"version": "4.3.0",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
|
||||||
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
|
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"color-convert": "^2.0.1"
|
"color-convert": "^2.0.1"
|
||||||
},
|
},
|
||||||
|
|
@ -3297,16 +3216,32 @@
|
||||||
"tslib": "^2.3.1"
|
"tslib": "^2.3.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/asyncc": {
|
||||||
|
"version": "2.0.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/asyncc/-/asyncc-2.0.6.tgz",
|
||||||
|
"integrity": "sha512-m3nkCP6CKuLubt2vwqoOio8NmOJPjUL6dcaNNxqc9q4H2Rq9wNs+2UsIzBegiJzUtoyh9X9iBe4GIhqu1uOvqA==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/asynckit": {
|
"node_modules/asynckit": {
|
||||||
"version": "0.4.0",
|
"version": "0.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
|
||||||
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
|
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/atomic-sleep": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/available-typed-arrays": {
|
"node_modules/available-typed-arrays": {
|
||||||
"version": "1.0.5",
|
"version": "1.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz",
|
||||||
"integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
|
"integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.4"
|
"node": ">= 0.4"
|
||||||
|
|
@ -3519,9 +3454,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/bson": {
|
"node_modules/bson": {
|
||||||
"version": "6.2.0",
|
"version": "6.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/bson/-/bson-6.3.0.tgz",
|
||||||
"integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q==",
|
"integrity": "sha512-balJfqwwTBddxfnidJZagCBPP/f48zj9Sdp3OJswREOgsJzHiQSaOIAtApSgDQFYgHqAvFkp53AFSqjMDZoTFw==",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=16.20.1"
|
"node": ">=16.20.1"
|
||||||
}
|
}
|
||||||
|
|
@ -3808,9 +3743,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/caniuse-lite": {
|
"node_modules/caniuse-lite": {
|
||||||
"version": "1.0.30001581",
|
"version": "1.0.30001583",
|
||||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz",
|
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001583.tgz",
|
||||||
"integrity": "sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ==",
|
"integrity": "sha512-acWTYaha8xfhA/Du/z4sNZjHUWjkiuoAi2LM+T/aL+kemKQgPT1xBb/YKjlQ0Qo8gvbHsGNplrEJ+9G3gL7i4Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -3860,7 +3795,6 @@
|
||||||
"version": "4.1.2",
|
"version": "4.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
|
||||||
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
|
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ansi-styles": "^4.1.0",
|
"ansi-styles": "^4.1.0",
|
||||||
"supports-color": "^7.1.0"
|
"supports-color": "^7.1.0"
|
||||||
|
|
@ -4103,7 +4037,6 @@
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
||||||
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"color-name": "~1.1.4"
|
"color-name": "~1.1.4"
|
||||||
},
|
},
|
||||||
|
|
@ -4114,8 +4047,7 @@
|
||||||
"node_modules/color-name": {
|
"node_modules/color-name": {
|
||||||
"version": "1.1.4",
|
"version": "1.1.4",
|
||||||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
||||||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"node_modules/color-support": {
|
"node_modules/color-support": {
|
||||||
"version": "1.1.3",
|
"version": "1.1.3",
|
||||||
|
|
@ -4491,6 +4423,31 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/debug-level": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/debug-level/-/debug-level-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-YyD8cnCVnTlN7la4/cKUWJq15clsrff8ZXbj7RND8dd0YAl+/SdBhtfemZUY3oU8oxXPfGirrPfPBPFaulLlGA==",
|
||||||
|
"dependencies": {
|
||||||
|
"asyncc": "^2.0.6",
|
||||||
|
"chalk": "^4.1.2",
|
||||||
|
"fast-safe-stringify": "^2.1.1",
|
||||||
|
"flatstr": "^1.0.12",
|
||||||
|
"map-lru": "^2.0.0",
|
||||||
|
"ms": "^2.1.3",
|
||||||
|
"sonic-boom": "^3.2.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"debug": "^4.3.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/debug-level/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/decamelize": {
|
"node_modules/decamelize": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
|
||||||
|
|
@ -4830,9 +4787,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/electron-to-chromium": {
|
"node_modules/electron-to-chromium": {
|
||||||
"version": "1.4.650",
|
"version": "1.4.656",
|
||||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.650.tgz",
|
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.656.tgz",
|
||||||
"integrity": "sha512-sYSQhJCJa4aGA1wYol5cMQgekDBlbVfTRavlGZVr3WZpDdOPcp6a6xUnFfrt8TqZhsBYYbDxJZCjGfHuGupCRQ==",
|
"integrity": "sha512-9AQB5eFTHyR3Gvt2t/NwR0le2jBSUNwCnMbUCejFWHD+so4tH40/dRLgoE+jxlPeWS43XJewyvCv+I8LPMl49Q==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/emoji-regex": {
|
"node_modules/emoji-regex": {
|
||||||
|
|
@ -4845,6 +4802,7 @@
|
||||||
"version": "0.1.13",
|
"version": "0.1.13",
|
||||||
"resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
|
"resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
|
||||||
"integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
|
"integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
|
||||||
|
"dev": true,
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"iconv-lite": "^0.6.2"
|
"iconv-lite": "^0.6.2"
|
||||||
|
|
@ -4854,6 +4812,7 @@
|
||||||
"version": "0.6.3",
|
"version": "0.6.3",
|
||||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
|
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
|
||||||
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
|
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
|
||||||
|
"dev": true,
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"safer-buffer": ">= 2.1.2 < 3.0.0"
|
"safer-buffer": ">= 2.1.2 < 3.0.0"
|
||||||
|
|
@ -5703,6 +5662,11 @@
|
||||||
"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
|
"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/fast-safe-stringify": {
|
||||||
|
"version": "2.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
|
||||||
|
"integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="
|
||||||
|
},
|
||||||
"node_modules/fastq": {
|
"node_modules/fastq": {
|
||||||
"version": "1.17.0",
|
"version": "1.17.0",
|
||||||
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz",
|
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz",
|
||||||
|
|
@ -5885,6 +5849,11 @@
|
||||||
"node": "^10.12.0 || >=12.0.0"
|
"node": "^10.12.0 || >=12.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/flatstr": {
|
||||||
|
"version": "1.0.12",
|
||||||
|
"resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz",
|
||||||
|
"integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw=="
|
||||||
|
},
|
||||||
"node_modules/flatted": {
|
"node_modules/flatted": {
|
||||||
"version": "3.2.9",
|
"version": "3.2.9",
|
||||||
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
|
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
|
||||||
|
|
@ -6442,7 +6411,6 @@
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
|
||||||
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
|
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
|
||||||
"dev": true,
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
|
|
@ -6490,12 +6458,12 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/has-tostringtag": {
|
"node_modules/has-tostringtag": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
|
||||||
"integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
|
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"has-symbols": "^1.0.2"
|
"has-symbols": "^1.0.3"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.4"
|
"node": ">= 0.4"
|
||||||
|
|
@ -6681,9 +6649,9 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/ignore": {
|
"node_modules/ignore": {
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
|
||||||
"integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==",
|
"integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 4"
|
"node": ">= 4"
|
||||||
|
|
@ -7082,14 +7050,16 @@
|
||||||
"integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ=="
|
"integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ=="
|
||||||
},
|
},
|
||||||
"node_modules/is-array-buffer": {
|
"node_modules/is-array-buffer": {
|
||||||
"version": "3.0.2",
|
"version": "3.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
|
||||||
"integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
|
"integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"call-bind": "^1.0.2",
|
"call-bind": "^1.0.2",
|
||||||
"get-intrinsic": "^1.2.0",
|
"get-intrinsic": "^1.2.1"
|
||||||
"is-typed-array": "^1.1.10"
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
},
|
},
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
|
|
@ -7428,12 +7398,12 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/is-typed-array": {
|
"node_modules/is-typed-array": {
|
||||||
"version": "1.1.12",
|
"version": "1.1.13",
|
||||||
"resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz",
|
"resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
|
||||||
"integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==",
|
"integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"which-typed-array": "^1.1.11"
|
"which-typed-array": "^1.1.14"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.4"
|
"node": ">= 0.4"
|
||||||
|
|
@ -8565,6 +8535,14 @@
|
||||||
"node": ">=4"
|
"node": ">=4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/map-lru": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/map-lru/-/map-lru-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-a5TlnsxvczXMY7U/U4P0b7GI3KSAonc+u2MQtWQS5L21K9UV4fYQbbgktj3eqP5ch04XtCOcoqR0OlILo906nA==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/map-obj": {
|
"node_modules/map-obj": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz",
|
||||||
|
|
@ -12288,7 +12266,7 @@
|
||||||
"version": "2.1.2",
|
"version": "2.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
||||||
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
|
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
|
||||||
"devOptional": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/sandwich-stream": {
|
"node_modules/sandwich-stream": {
|
||||||
"version": "2.0.2",
|
"version": "2.0.2",
|
||||||
|
|
@ -12777,6 +12755,14 @@
|
||||||
"node": ">= 10"
|
"node": ">= 10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/sonic-boom": {
|
||||||
|
"version": "3.8.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.8.0.tgz",
|
||||||
|
"integrity": "sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==",
|
||||||
|
"dependencies": {
|
||||||
|
"atomic-sleep": "^1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/sort-keys": {
|
"node_modules/sort-keys": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz",
|
||||||
|
|
@ -12936,6 +12922,10 @@
|
||||||
"node": "*"
|
"node": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/stats_bot": {
|
||||||
|
"resolved": "apps/bot",
|
||||||
|
"link": true
|
||||||
|
},
|
||||||
"node_modules/store2": {
|
"node_modules/store2": {
|
||||||
"version": "2.14.2",
|
"version": "2.14.2",
|
||||||
"resolved": "https://registry.npmjs.org/store2/-/store2-2.14.2.tgz",
|
"resolved": "https://registry.npmjs.org/store2/-/store2-2.14.2.tgz",
|
||||||
|
|
@ -13136,7 +13126,6 @@
|
||||||
"version": "7.2.0",
|
"version": "7.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
|
||||||
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
|
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"has-flag": "^4.0.0"
|
"has-flag": "^4.0.0"
|
||||||
},
|
},
|
||||||
|
|
@ -14339,16 +14328,16 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/which-typed-array": {
|
"node_modules/which-typed-array": {
|
||||||
"version": "1.1.13",
|
"version": "1.1.14",
|
||||||
"resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz",
|
"resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz",
|
||||||
"integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==",
|
"integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"available-typed-arrays": "^1.0.5",
|
"available-typed-arrays": "^1.0.6",
|
||||||
"call-bind": "^1.0.4",
|
"call-bind": "^1.0.5",
|
||||||
"for-each": "^0.3.3",
|
"for-each": "^0.3.3",
|
||||||
"gopd": "^1.0.1",
|
"gopd": "^1.0.1",
|
||||||
"has-tostringtag": "^1.0.0"
|
"has-tostringtag": "^1.0.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.4"
|
"node": ">= 0.4"
|
||||||
|
|
|
||||||
18
package.json
18
package.json
|
|
@ -3,9 +3,12 @@
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
|
"workspaces": [
|
||||||
|
"apps/bot"
|
||||||
|
],
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "sh -ac '. ./.env; ts-node src/index'",
|
"start": "lerna run start",
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
"test": "lerna run test"
|
||||||
},
|
},
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
"author": "",
|
"author": "",
|
||||||
|
|
@ -13,7 +16,6 @@
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/chai": "4.2.11",
|
"@types/chai": "4.2.11",
|
||||||
"@types/chai-as-promised": "7.1.2",
|
"@types/chai-as-promised": "7.1.2",
|
||||||
"@types/express": "^4.17.21",
|
|
||||||
"@types/mocha": "10.0.1",
|
"@types/mocha": "10.0.1",
|
||||||
"@types/node": "13.13.52",
|
"@types/node": "13.13.52",
|
||||||
"@types/prompt": "^1.1.8",
|
"@types/prompt": "^1.1.8",
|
||||||
|
|
@ -34,7 +36,7 @@
|
||||||
"eslint-plugin-jsx-a11y": "6.7.1",
|
"eslint-plugin-jsx-a11y": "6.7.1",
|
||||||
"eslint-plugin-mocha": "10.1.0",
|
"eslint-plugin-mocha": "10.1.0",
|
||||||
"knip": "2.14.3",
|
"knip": "2.14.3",
|
||||||
"lerna": "^7.3.0",
|
"lerna": "^7.4.2",
|
||||||
"mocha": "10.2.0",
|
"mocha": "10.2.0",
|
||||||
"mocha-each": "2.0.1",
|
"mocha-each": "2.0.1",
|
||||||
"mocha-junit-reporter": "2.0.2",
|
"mocha-junit-reporter": "2.0.2",
|
||||||
|
|
@ -44,13 +46,5 @@
|
||||||
"ts-mocha": "10.0.0",
|
"ts-mocha": "10.0.0",
|
||||||
"ts-node": "10.9.1",
|
"ts-node": "10.9.1",
|
||||||
"typescript": "4.9.5"
|
"typescript": "4.9.5"
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"input": "^1.0.1",
|
|
||||||
"mongodb": "^6.3.0",
|
|
||||||
"mongoose": "^8.1.1",
|
|
||||||
"prompt": "^1.3.0",
|
|
||||||
"telegraf": "^4.15.3",
|
|
||||||
"telegram": "^2.19.10"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
83
src/bot.ts
83
src/bot.ts
|
|
@ -1,83 +0,0 @@
|
||||||
import { Telegraf } from 'telegraf';
|
|
||||||
import { message } from 'telegraf/filters';
|
|
||||||
import { ChatFromGetChat } from 'telegraf/typings/core/types/typegram';
|
|
||||||
|
|
||||||
export type ChannelInfo = {
|
|
||||||
chatId: number,
|
|
||||||
memberCount: number,
|
|
||||||
};
|
|
||||||
|
|
||||||
export type MessageInfo = {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
export class ChannelBot {
|
|
||||||
private readonly bot: Telegraf;
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
private readonly token: string,
|
|
||||||
) {
|
|
||||||
|
|
||||||
this.bot = new Telegraf(
|
|
||||||
process.env.TELEGRAM_BOT_TOKEN ?? '',
|
|
||||||
);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public async connect(): Promise<void> {
|
|
||||||
|
|
||||||
process.once('SIGINT', () => this.bot.stop('SIGINT'));
|
|
||||||
process.once('SIGTERM', () => this.bot.stop('SIGTERM'));
|
|
||||||
|
|
||||||
this.bot.launch(
|
|
||||||
{
|
|
||||||
allowedUpdates: [
|
|
||||||
'chat_join_request',
|
|
||||||
'chat_member',
|
|
||||||
'channel_post',
|
|
||||||
'edited_channel_post',
|
|
||||||
'poll',
|
|
||||||
'poll_answer'
|
|
||||||
],
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async getChannelInfo(channelId: number): Promise<ChannelInfo> {
|
|
||||||
|
|
||||||
const memberCount = await this.bot.telegram.getChatMembersCount(channelId);
|
|
||||||
|
|
||||||
const info: ChatFromGetChat = await this.bot.telegram.getChat(channelId);
|
|
||||||
|
|
||||||
return {
|
|
||||||
chatId: info.id,
|
|
||||||
memberCount,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// bot.on('channel_post', async (ctx) => {
|
|
||||||
// console.log('channel_post');
|
|
||||||
// console.dir(ctx.channelPost.chat.id);
|
|
||||||
|
|
||||||
// await sendChannelStats(ctx.chat.id);
|
|
||||||
// });
|
|
||||||
|
|
||||||
// bot.on('new_chat_members', async (ctx) => {
|
|
||||||
// console.log('new_chat_members');
|
|
||||||
// console.dir(ctx.chatMember);
|
|
||||||
|
|
||||||
// await sendChannelStats(ctx.chat.id);
|
|
||||||
// });
|
|
||||||
|
|
||||||
// bot.on('chat_member', async (ctx) => {
|
|
||||||
// console.log('chat_member');
|
|
||||||
// console.dir(ctx.chatMember);
|
|
||||||
|
|
||||||
// await sendChannelStats(ctx.chat.id);
|
|
||||||
// });
|
|
||||||
|
|
||||||
// // bot.start((ctx) => ctx.reply('Welcome'));
|
|
||||||
// // bot.help((ctx) => ctx.reply('Send me a sticker'));
|
|
||||||
// // bot.on(message('sticker'), (ctx) => ctx.reply('👍'));
|
|
||||||
// // bot.hears('hi', (ctx) => ctx.reply('Hey there'));
|
|
||||||
40
src/index.ts
40
src/index.ts
|
|
@ -1,40 +0,0 @@
|
||||||
import { ChannelClient } from './client';
|
|
||||||
import { ChannelBot } from './bot';
|
|
||||||
|
|
||||||
(async () => {
|
|
||||||
|
|
||||||
const apiId = Number(process.env.TELEGRAM_API_ID ?? '0');
|
|
||||||
const apiHash = process.env.TELEGRAM_API_HASH ?? '';
|
|
||||||
const apiSession = process.env.TELEGRAM_API_SESSION ?? '';
|
|
||||||
|
|
||||||
const botToken = process.env.TELEGRAM_BOT_TOKEN ?? '';
|
|
||||||
|
|
||||||
const channelId = Number(process.env.TELEGRAM_CHANNEL_ID ?? '0');
|
|
||||||
|
|
||||||
const client = new ChannelClient(
|
|
||||||
apiId,
|
|
||||||
apiHash,
|
|
||||||
apiSession,
|
|
||||||
);
|
|
||||||
|
|
||||||
const bot = new ChannelBot(
|
|
||||||
botToken,
|
|
||||||
);
|
|
||||||
|
|
||||||
await bot.connect();
|
|
||||||
await client.connect();
|
|
||||||
|
|
||||||
const messages = await client.getChannelMessages(channelId, { statsOnly: true });
|
|
||||||
console.dir(messages);
|
|
||||||
|
|
||||||
const users = await client.getChannelUsers(channelId);
|
|
||||||
|
|
||||||
console.dir(users);
|
|
||||||
console.dir(await bot.getChannelInfo(channelId));
|
|
||||||
|
|
||||||
// for (const message of messages)
|
|
||||||
// console.dir(await client.getChannelMessage(channelId, message.id));
|
|
||||||
|
|
||||||
})()
|
|
||||||
.catch((err) => console.error);
|
|
||||||
|
|
||||||
Loading…
Reference in New Issue