diff --git a/src/handlers/discussion.ts b/src/handlers/discussion.ts index 12f3ea6..d7af89d 100644 --- a/src/handlers/discussion.ts +++ b/src/handlers/discussion.ts @@ -56,7 +56,7 @@ composer const replyMarkup = getReplyMarkup({ chat, directLink, - commentsLink: `https://t.me/c/${chatId}/1?thread=${ctx.msg.message_id}`, + commentsLink: `https://t.me/c/${chatId}/${ctx.msg.message_id}?thread=${ctx.msg.message_id}`, message_id: message.message_id, plus, minus, diff --git a/src/handlers/hashtag/edited-message.ts b/src/handlers/hashtag/edited-message.ts index abb15d0..e91937f 100644 --- a/src/handlers/hashtag/edited-message.ts +++ b/src/handlers/hashtag/edited-message.ts @@ -11,6 +11,7 @@ export const handleEditedMessage: HashtagHandler = async ( message, entities, text, + textIsCaption, hashtagEntities, tags, ) => { @@ -41,6 +42,7 @@ export const handleEditedMessage: HashtagHandler = async ( message, entities, text, + textIsCaption, hashtagEntities, tags, ); @@ -140,7 +142,7 @@ export const handleEditedMessage: HashtagHandler = async ( channelID: channelMessage.channel_id, message, text, - entities, + textIsCaption, }); await new Message({ diff --git a/src/handlers/hashtag/index.ts b/src/handlers/hashtag/index.ts index c4e5661..0b55b9e 100644 --- a/src/handlers/hashtag/index.ts +++ b/src/handlers/hashtag/index.ts @@ -46,6 +46,7 @@ composer message, entities, text, + Boolean(message.caption), hashtagEntities, tags, ); @@ -55,6 +56,7 @@ composer message, entities, text, + Boolean(message.caption), hashtagEntities, tags, ); diff --git a/src/handlers/hashtag/new-message.ts b/src/handlers/hashtag/new-message.ts index 89d0999..15a137b 100644 --- a/src/handlers/hashtag/new-message.ts +++ b/src/handlers/hashtag/new-message.ts @@ -3,12 +3,14 @@ import { GrammyError } from 'grammy'; import Group from '../../models/group'; import { Group as IGroup } from '../../typings/db'; import Message from '../../models/message'; +import { lowerCaseObject } from '../../utils'; export const handleNewMessage: HashtagHandler = async ( ctx, message, entities, text, + textIsCaption, hashtagEntities, tags, ) => { @@ -29,18 +31,20 @@ export const handleNewMessage: HashtagHandler = async ( } const sentChannels: number[] = []; + const [chatTags, tagKeyMap] = lowerCaseObject(chat.tags); for (const tag of tags) { - if (!chat.tags[tag]) { + if (!chatTags[tag]) { continue; } // Convert to array for backwards compatibility - if (!Array.isArray(chat.tags[tag])) { - chat.tags[tag] = [chat.tags[tag] as unknown as number]; + if (!Array.isArray(chatTags[tag])) { + chatTags[tag] = [chatTags[tag] as unknown as number]; + chat.tags[tagKeyMap[tag]] = chatTags[tag]; } - for (const channelID of chat.tags[tag]) { + for (const channelID of chatTags[tag]) { if (sentChannels.includes(channelID)) { continue; } @@ -52,7 +56,7 @@ export const handleNewMessage: HashtagHandler = async ( channelID, message, text, - entities, + textIsCaption, }); sentChannels.push(channelID); @@ -72,10 +76,13 @@ export const handleNewMessage: HashtagHandler = async ( throw error; } - if (chat.tags[tag].length === 1) { - delete chat.tags[tag]; + if (chat.tags[tagKeyMap[tag]].length === 1) { + delete chat.tags[tagKeyMap[tag]]; } else { - chat.tags[tag].splice(chat.tags[tag].indexOf(channelID), 1); + chat.tags[tagKeyMap[tag]].splice( + chat.tags[tagKeyMap[tag]].indexOf(channelID), + 1, + ); } chat.markModified('tags'); diff --git a/src/handlers/hashtag/utils.ts b/src/handlers/hashtag/utils.ts index 328ed0e..29d2943 100644 --- a/src/handlers/hashtag/utils.ts +++ b/src/handlers/hashtag/utils.ts @@ -1,5 +1,5 @@ import { Context, InlineKeyboard } from 'grammy'; -import { MessageEntity, Message as TMessage } from '@grammyjs/types'; +import { MessageEntity, MessageId, Message as TMessage } from '@grammyjs/types'; import { Group as IGroup } from '../../typings/db'; import { formatLikeKeyboard } from '../../utils'; @@ -9,6 +9,7 @@ export interface HashtagHandler { message: TMessage, entities: MessageEntity[], text: string, + textIsCaption: boolean, hashtagEntities: MessageEntity[], tags: string[], ): Promise; @@ -61,15 +62,15 @@ export const sendMessage = async ({ channelID, message, text, - entities, + textIsCaption, }: { ctx: Context; chat: IGroup; channelID: number; message: TMessage; text: string; - entities: MessageEntity[]; -}): Promise => { + textIsCaption: boolean; +}): Promise => { // Use `!== false` in case it's `undefined` if (!chat.settings || chat.settings.forwards !== false) { return await ctx.api.forwardMessage( @@ -85,43 +86,27 @@ export const sendMessage = async ({ ? message.chat.username : `c/${chatId}`; + const addReplyMarkup = text.length <= (textIsCaption ? 1024 : 4096); const replyMarkup = getReplyMarkup({ chat, directLink, message_id: message.message_id, }); - if (message.audio) { - return await ctx.api.sendAudio(channelID, message.audio.file_id, { - reply_markup: replyMarkup, - caption: text, - caption_entities: entities, - }); - } else if (message.document) { - return await ctx.api.sendDocument(channelID, message.document.file_id, { - reply_markup: replyMarkup, - caption: text, - caption_entities: entities, - }); - } else if (message.photo) { - const photos = [...message.photo]; - const fileId = photos.pop()!.file_id; + const copiedMessage = await ctx.api.copyMessage( + channelID, + message.chat.id, + message.message_id, + addReplyMarkup ? { reply_markup: replyMarkup } : undefined, + ); - return await ctx.api.sendPhoto(channelID, fileId, { - reply_markup: replyMarkup, - caption: text, - caption_entities: entities, - }); - } else if (message.video) { - return await ctx.api.sendVideo(channelID, message.video.file_id, { - reply_markup: replyMarkup, - caption: text, - caption_entities: entities, - }); - } else { - return await ctx.api.sendMessage(channelID, text, { - reply_markup: replyMarkup, - entities, - }); + if (!addReplyMarkup) { + await ctx.api.editMessageReplyMarkup( + channelID, + copiedMessage.message_id, + { reply_markup: replyMarkup }, + ); } + + return copiedMessage; }; diff --git a/src/handlers/settings.ts b/src/handlers/settings.ts index aea2010..c682163 100644 --- a/src/handlers/settings.ts +++ b/src/handlers/settings.ts @@ -25,7 +25,7 @@ const generateMarkup = (chat: IGroup) => { const comments = chat.settings!.comments === true; // Default false const likes = chat.settings!.likes === true; // Default false - return new InlineKeyboard() + const keyboard = new InlineKeyboard() .text( buttonText`Forwards ${forwards}`, buttonData('forwards', forwards), @@ -37,8 +37,13 @@ const generateMarkup = (chat: IGroup) => { buttonText`Comments ${comments}`, buttonData('comments', comments), ) - .row() - .text(buttonText`Likes ${likes}`, buttonData('likes', likes)); + .row(); + + if (chat.settings!.likes) { + keyboard.text(buttonText`Likes ${likes}`, buttonData('likes', likes)); + } + + return keyboard; }; const updateSettings = ( diff --git a/src/utils.ts b/src/utils.ts index 8f16575..0611eda 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -78,3 +78,21 @@ export const formatLikeKeyboard = ( return keyboard; }; + +// returns an array where the first item is the object with all the keys lowercase +// and the second item is a map of the lowercase keys to the original keys +export const lowerCaseObject = ( + object: T, +): [T, { [k: string]: string }] => { + return Object.entries(object).reduce<[T, { [k: string]: string }]>( + ([result, keyMap], [key, value]) => { + const lowerCaseKey = key.toLowerCase(); + + result[lowerCaseKey as keyof T] = value as T[keyof T]; + keyMap[lowerCaseKey] = key; + + return [result, keyMap]; + }, + [{} as T, {} as { [k: string]: string }], + ); +};