TelegramPWA/src/lib/gramjs/client/MockClient.ts
2022-12-15 19:19:17 +01:00

358 lines
10 KiB
TypeScript

import BigInt from 'big-integer';
import { UpdateConnectionState } from '../network';
import Api from '../tl/api';
type Peer = {
peer: Api.Chat | Api.Channel | Api.User;
inputPeer: Api.TypePeer;
TEST_messages: Api.Message[];
TEST_sendMessage: (data: CreateMessageParams) => Api.Message | undefined;
};
type CreateMessageParams = {
fromId?: any;
repliesChannelId?: any;
replyingTo?: Api.MessageReplyHeader;
};
class TelegramClient {
addEventHandler(callback: any, event: any) {
callback(event.build(new UpdateConnectionState(UpdateConnectionState.connected)));
}
private lastId = 0;
private peers: Peer[] = [];
private dialogs: Api.Dialog[] = [];
start() {
}
constructor() {
const user = this.createUser({
firstName: 'Test',
lastName: 'Account',
});
user.TEST_sendMessage({});
const chat = this.createChat();
chat.TEST_sendMessage({});
const channel = this.createChannel({
title: 'Test Channel',
username: 'testchannel',
});
const discussion = this.createChannel({
title: 'Test Discussion',
username: 'testdiscuss',
isMegagroup: true,
});
const message = channel.TEST_sendMessage({
repliesChannelId: discussion.peer.id,
});
const { id } = discussion.TEST_sendMessage({})!;
discussion.TEST_sendMessage({
fromId: new Api.PeerUser({
userId: user.peer.id,
}),
replyingTo: new Api.MessageReplyHeader({
replyToMsgId: id,
replyToPeerId: new Api.PeerChannel({
channelId: channel.peer.id,
}),
replyToTopId: message!.id,
}),
});
}
createDialog(peer: Api.TypePeer) {
return new Api.Dialog({
peer,
topMessage: 0,
readInboxMaxId: 0,
readOutboxMaxId: 0,
unreadCount: 0,
unreadMentionsCount: 0,
unreadReactionsCount: 0,
notifySettings: new Api.PeerNotifySettings({}),
});
}
createMessage(peer: Api.TypePeer) {
return ({
fromId,
repliesChannelId,
replyingTo,
}: CreateMessageParams) => {
const pi = this.getPeerIndex(peer);
const p = this.getPeer(peer);
if (!p || pi === undefined) return undefined;
const message = new Api.Message({
id: p.TEST_messages.length + 1,
fromId,
peerId: peer,
date: Number(new Date()) / 1000 + pi * 60,
message: 'lol @channel',
entities: [new Api.MessageEntityMention({
offset: 4,
length: 8,
})],
replyTo: replyingTo,
replies: new Api.MessageReplies({
comments: true,
replies: 0,
repliesPts: 0,
channelId: repliesChannelId ? BigInt(repliesChannelId) : undefined,
}),
});
this.peers[pi].TEST_messages.push(message);
return message;
};
}
createChat() {
const chat = new Api.Chat({
id: BigInt(this.lastId++),
title: 'Some chat',
photo: new Api.ChatPhotoEmpty(),
participantsCount: 1,
date: 1000,
version: 1,
});
const peerChat = new Api.PeerChat({
chatId: chat.id,
});
this.dialogs.push(this.createDialog(peerChat));
const testChat: Peer = {
peer: chat, inputPeer: peerChat, TEST_messages: [], TEST_sendMessage: this.createMessage(peerChat),
};
this.peers.push(testChat);
return testChat;
}
createChannel({ title, username, isMegagroup }: {
title: string;
username: string;
isMegagroup?: boolean;
}) {
const channel = new Api.Channel({
username,
id: BigInt(this.lastId++),
megagroup: isMegagroup ? true : undefined,
title,
photo: new Api.ChatPhotoEmpty(),
participantsCount: 1,
date: 1000,
creator: true,
});
const peerChannel = new Api.PeerChannel({
channelId: channel.id,
});
this.dialogs.push(this.createDialog(peerChannel));
const testChat: Peer = {
peer: channel, inputPeer: peerChannel, TEST_messages: [], TEST_sendMessage: this.createMessage(peerChannel),
};
this.peers.push(testChat);
return testChat;
}
createUser({
firstName,
lastName,
}: {
firstName: string;
lastName: string;
}): Peer {
const user = new Api.User({
// self: true,
verified: true,
id: BigInt(this.lastId++),
// accessHash?: long;
firstName,
lastName,
username: 'man',
// phone?: string;
// photo?: Api.TypeUserProfilePhoto;
// status?: Api.TypeUserStatus;
// botInfoVersion?: int;
// restrictionReason?: Api.//TypeRestrictionReason[];
// botInlinePlaceholder?: string;
// langCode?: string;
});
const peerUser = new Api.PeerUser({
userId: user.id,
});
this.dialogs.push(this.createDialog(peerUser));
const testChat: Peer = {
peer: user, inputPeer: peerUser, TEST_messages: [], TEST_sendMessage: this.createMessage(peerUser),
};
this.peers.push(testChat);
return testChat;
}
invoke(request: any) {
// await new Promise(resolve => setTimeout(resolve, 1000))
if (request instanceof Api.messages.GetDiscussionMessage) {
return new Api.messages.DiscussionMessage({
messages: [
this.peers[3].TEST_messages[0],
],
maxId: 2,
unreadCount: 1,
chats: [],
users: [],
});
}
if (request instanceof Api.messages.GetHistory) {
const peer = this.getPeer(request.peer);
if (!peer) return undefined;
return new Api.messages.Messages({
messages: peer.TEST_messages,
chats: [],
users: [],
});
}
if (request instanceof Api.messages.GetReplies) {
const peer = this.peers[3];
if (!peer) return undefined;
return new Api.messages.ChannelMessages({
messages: peer.TEST_messages,
topics: [],
pts: 0,
count: peer.TEST_messages.length,
chats: [],
users: [],
});
}
if (request instanceof Api.messages.GetDialogFilters) {
return [new Api.DialogFilter({
contacts: true,
nonContacts: true,
groups: true,
broadcasts: true,
bots: true,
// excludeMuted?: true;
// excludeRead?: true;
// excludeArchived?: true;
id: 1,
title: 'Dialog Filter',
// emoticon?: string;
pinnedPeers: [],
includePeers: [],
excludePeers: [],
})];
}
if (request instanceof Api.contacts.GetTopPeers) {
return new Api.contacts.TopPeers({
categories: [new Api.TopPeerCategoryPeers({
category: new Api.TopPeerCategoryCorrespondents(),
count: 1,
peers: [
new Api.TopPeer({
peer: this.peers[0].inputPeer,
rating: 100,
}),
],
})],
chats: [],
users: [
this.getUsers()[0],
],
});
}
if (request instanceof Api.messages.GetPinnedDialogs) {
return new Api.messages.PeerDialogs({
dialogs: [],
chats: [],
messages: [],
users: [],
state: new Api.updates.State({
pts: 0,
qts: 0,
date: 0,
seq: 0,
unreadCount: 0,
}),
});
}
if (request instanceof Api.messages.GetDialogs) {
if (request.folderId || !(request.offsetPeer instanceof Api.InputPeerEmpty)) {
return new Api.messages.Dialogs({
dialogs: [],
users: [],
chats: [],
messages: [],
});
}
return new Api.messages.Dialogs({
dialogs: this.dialogs,
messages: this.getAllMessages(),
chats: this.getChats(),
users: this.getUsers(),
});
}
return undefined;
// console.log(request.className, request);
}
private getPeerIndex(peer: Api.TypeInputPeer) {
const id = 'channelId' in peer ? peer.channelId : (
'userId' in peer ? peer.userId : (
'chatId' in peer ? peer.chatId : undefined
)
);
if (!id) return undefined;
return this.peers.findIndex((l) => l.peer.id.toString() === id.toString());
}
private getPeer(peer: Api.TypeInputPeer) {
const index = this.getPeerIndex(peer);
if (index === undefined) return undefined;
return this.peers[index];
}
private getAllMessages() {
return this.peers.reduce((acc: Api.Message[], el) => {
acc.push(...el.TEST_messages);
return acc;
}, []);
}
private getChats() {
return this.peers.filter((l) => !(l.peer instanceof Api.User)).map((l) => l.peer);
}
private getUsers() {
return this.peers.filter((l) => l.peer instanceof Api.User).map((l) => l.peer);
}
}
export default TelegramClient;