duagram
Version:
Telegram Framework for userbot or bot api
315 lines (257 loc) • 8.93 kB
JavaScript
const removeNull = (obj) => {
Object.keys(obj).forEach(k =>
(obj[k] && typeof obj[k] === 'object') && removeNull(obj[k])
||
!obj[k] && delete obj[k]
);
return obj;
};
class DuaMessage {
constructor(update, more = {}) {
this.more = more;
this.update = update;
this.chat = more.peer || false;
this.from = more.from || false;
this.BroadcastStore = {};
this.Store = {
message: {},
user: {},
channel: {},
broadcast: {}
}
}
get EntityList() {
return [
'mention', // @username
'hashtag', // #hashtag)
'cashtag', // ($USD),
'bot_command', // /start@jobs_bot)
'url', // https://telegram.org
'email', // do-not-reply@telegram.org
'phone_number', // +1-212-555-0123
'bold', // bold text
'italic', // italic text
'underline', // underlined text
'strikethrough', // strikethrough text
'code', // monowidth string
'pre', // monowidth block
'text_link', // for clickable text URLs
'text_mention' // for users without usernames
]
}
fieldType(data) {
if (!data) return false;
let type = data.className.replace('Peer', '').toLowerCase();
return {
type,
id: data[type + 'Id']
}
}
getTypeClassName(data, key = '') {
return data.className ? data.className.replace(key, '').toLowerCase() : false;
}
entitiesMessage(entities) {
this.broadcastStore('entities');
let result = [];
let typeEntity = (value) => {
let result = this.getTypeClassName(value, 'MessageEntity')
result
.replace(/texturl/i, 'text_link')
.replace(/botcommand/i, 'bot_command')
.replace(/phone/i, 'phone_number')
.replace(/strike/i, 'strikethrough')
.replace(/mentionname/i, 'text_mention')
;
return result;
}
Object.entries(entities).forEach(([key, value]) => {
let type = typeEntity(value);
this.broadcastStore(type);
result.push({
type,
offset: value.offset,
length: value.length,
url: value.url || false,
user: value.userId ? { id: value.userId } : false,
});
});
return result;
}
get getMe() {
return this.userStore(this.more.me, true);
}
// ==========================================================================================
broadcastStore() {
if (arguments.length < 1) return;
if (arguments.length < 1) return;
Object.entries(arguments).forEach(([key, value]) => {
this.Store.broadcast[value] = true;
});
}
messageStore(data) {
let id = data.id;
let entities = data.entities ? this.entitiesMessage(data.entities) : false;
let reply_to_message = data.replyTo?.replyToTopId ? { id: data.replyTo?.replyToTopId } : false;
let message = {
id,
in: data.out ? false : true,
out: data.out,
date: data.date,
edit_date: data.editDate,
mentioned: data.mentioned,
media: data.media ? this.mediaStore(data.media) : false,
media_unread: data.mediaUnread,
pinned: data.pinned,
post_author: data.postAuthor,
via_bot: data.viaBotId ? { id: data.viaBotId } : false,
views: data.views,
silent: data.silent,
text: data.message,
fromScheduled: data.fromScheduled,
entities,
reply_to_message,
}
this.Store.message[id] = message;
}
userStore(data, me = false) {
let id = data.id;
let user = {
id,
self: data.self,
bot: data.bot,
contact: data.contact,
mutual_contact: data.mutualContact,
verified: data.verified,
restricted: data.restricted,
min: data.min,
bot_inline_geo: data.botInlineGeo,
bot_chat_history: data.botChatHistory,
bot_no_chats: data.botNochats,
apply_min_photo: data.applyMinPhoto,
support: data.support,
scam: data.scam,
fake: data.fake,
// hash: fm.accessHash,
first_name: data.firstName,
last_name: data.lastName,
username: data.username,
phone: data.phone,
};
if (me) return user;
this.Store.user[id] = user;
};
channelStore(data) {
let id = data.id;
let type = data.className.toLowerCase();
// if (type == 'channel') id = Number('-100' + id);
let channel = {
id: type == 'channel' ? Number('-100' + id) : Number('-' + id),
type,
first_name: data.firstName,
last_name: data.lastName,
username: data.username,
verified: data.verified,
title: data.title,
};
this.Store.channel[data.id] = channel;
};
store() {
// users
let users = this.update.users;
users.forEach(data => this.userStore(data));
// messages
let messages = this.update.messages;
messages.forEach(data => this.messageStore(data));
// chats
let channel = this.update.chats;
channel.forEach(data => this.channelStore(data));
}
mediaStore(data) {
this.broadcastStore('media');
let type = data.className.replace('MessageMedia', '').toLowerCase();
this.broadcastStore(type);
// console.log(' >>> MEDIA:', data);
if (!data[type]) return { raw: data };
let mime = data[type].mimeType;
let bc = typeof mime == "string" ? mime.split('/') : false;
if (bc) this.broadcastStore(...bc);
if (/sticker/i.exec(data[type].mimeType)) this.broadcastStore('sticker');
let result = {
id: data[type].id?.value,
type,
date: data[type].date,
size: data[type].size,
mime_type: mime,
dc: data[type].dcId
}
// result[type] = data[type];
result.raw = data;
return result;
}
get mainMessage() {
let message = this.update.messages[0];
return this.Store.message[message.id];
}
get context() {
this.store();
// console.log('==> Messages:', this.update.messages, '\n===END');
// console.log('==> ISI STORE', this.Store);
let broadcast = [];
let messages = this.update.messages;
// main messsage data
let main = this.mainMessage;
// from data
let from = 'me';
if (main.in) {
let data = this.from || this.fieldType(messages[0].fromId);
data = data || { type: 'user', id: messages[0]._senderId };
if (data) {
from = this.Store[data.type][data.id];
}
}
// chat data
let data = this.chat || this.fieldType(messages[0].peerId);
let chat;
if (this.chat?.type == 'chat') {
chat = this.Store.channel[this.chat.id]
} else {
chat = this.Store[data.type][data.id];
}
// reply data
let reply_to_message = false;
if (this.more.reply) {
this.broadcastStore('reply');
reply_to_message = this.Store.message[this.more.reply];
if (reply_to_message.out) reply_to_message.from = 'me';
if (reply_to_message.in) {
let data = this.fieldType(messages[1].fromId);
data = data || { type: 'user', id: messages[1]._senderId };
if (data) {
reply_to_message.from = this.Store[data.type][data.id];
}
}
}
// forward data
let forward_from = {}
if (this.more.forward && this.more.forward?.id) {
this.broadcastStore('forward');
forward_from = {
forward_from: this.Store[this.more.forward.type][this.more.forward.id]
}
}
let result = {
...main,
...forward_from,
reply_to_message,
from,
chat
}
result = removeNull(result);
Object.entries(this.Store.broadcast).forEach(([key, value]) => broadcast.push(key));
return {
...result,
event: broadcast
}
}
}
module.exports = DuaMessage;