Ver código fonte

Edited message event handler (#235)

* refactor: Improve getMessageId function with typescript

* feat: edited message event

- Add edited message event handler: EditedMessage and EditedMessageEvent
- Add 1 more client.addEventHandler overload for EditedMessageEvent

* refactor: Utils.getMessageId

- Add back message.SUBCLASS_OF_ID === 0x790009e3 check for runtime error handling if user doesn't use typescript
Man Nguyen 3 anos atrás
pai
commit
26975ce70e
3 arquivos alterados com 67 adições e 8 exclusões
  1. 8 8
      gramjs/Utils.ts
  2. 5 0
      gramjs/client/TelegramClient.ts
  3. 54 0
      gramjs/events/EditedMessage.ts

+ 8 - 8
gramjs/Utils.ts

@@ -1,4 +1,4 @@
-import type { Entity, EntityLike, FileLike } from "./define";
+import type { Entity, EntityLike, FileLike, MessageIDLike } from "./define";
 import { Api } from "./tl";
 import bigInt from "big-integer";
 import * as markdown from "./extensions/markdown";
@@ -1171,19 +1171,19 @@ export function  _getEntityPair(entityId, entities, cache, getInputPeer = getInp
 }
 */
 
-export function getMessageId(message: any): number | undefined {
+export function getMessageId(
+    message: number | Api.TypeMessage | MessageIDLike
+): number | undefined {
     if (message === null || message === undefined) {
         return undefined;
-    }
-    if (typeof message == "number") {
+    } else if (typeof message === "number") {
         return message;
-    }
-
-    if (message.SUBCLASS_OF_ID === 0x790009e3) {
+    } else if (message.SUBCLASS_OF_ID === 0x790009e3 || "id" in message) {
         // crc32(b'Message')
         return message.id;
+    } else {
+        throw new Error(`Invalid message type: ${message.constructor.name}`);
     }
-    throw new Error(`Invalid message type: ${message.constructor.name}`);
 }
 
 /**

+ 5 - 0
gramjs/client/TelegramClient.ts

@@ -27,6 +27,7 @@ import { Session } from "../sessions";
 import { inspect } from "util";
 import { Album, AlbumEvent } from "../events/Album";
 import { CallbackQuery, CallbackQueryEvent } from "../events/CallbackQuery";
+import { EditedMessage, EditedMessageEvent } from "../events/EditedMessage";
 
 /**
  * The TelegramClient uses several methods in different files to provide all the common functionality in a nice interface.</br>
@@ -1041,6 +1042,10 @@ export class TelegramClient extends TelegramBaseClient {
         callback: { (event: AlbumEvent): void },
         event: Album
     ): void;
+    addEventHandler(
+        callback: { (event: EditedMessageEvent): void },
+        event: EditedMessage
+    ): void;
     addEventHandler(
         callback: { (event: any): void },
         event?: EventBuilder

+ 54 - 0
gramjs/events/EditedMessage.ts

@@ -0,0 +1,54 @@
+import { Api } from "../tl";
+import { NewMessage, NewMessageEvent, NewMessageInterface } from "./NewMessage";
+
+export interface EditedMessageInterface extends NewMessageInterface {
+    func?: { (event: EditedMessageEvent): boolean };
+}
+
+/**
+ * Occurs whenever a text message or a message with media was edited.
+ * @example
+ * ```ts
+ * async function editedEventPrint(event: EditedMessageEvent) {
+ *   const message = event.message as Api.Message;
+ *
+ *   console.log(`Message ${message.id} from channel ${message.chatId!.toString();} was edited at ${message.editDate}`)
+ * }
+ * // adds an event handler for new messages
+ * client.addEventHandler(editedEventPrint, new EditedMessage({}));
+ * ```
+ */
+export class EditedMessage extends NewMessage {
+    func?: { (event: EditedMessageEvent): boolean };
+
+    constructor(editedMessageParams: EditedMessageInterface) {
+        super(editedMessageParams);
+    }
+
+    build(
+        update: Api.TypeUpdate | Api.TypeUpdates,
+        callback: undefined,
+        selfId: bigInt.BigInteger
+    ) {
+        if (
+            update instanceof Api.UpdateEditChannelMessage ||
+            update instanceof Api.UpdateEditMessage
+        ) {
+            if (!(update.message instanceof Api.Message)) {
+                return undefined;
+            }
+            const event = new EditedMessageEvent(update.message, update);
+            this.addAttributes(event);
+            return event;
+        }
+    }
+}
+
+export class EditedMessageEvent extends NewMessageEvent {
+    constructor(
+        message: Api.Message,
+        originalUpdate: Api.TypeUpdate | Api.TypeUpdates
+    ) {
+        super(message, originalUpdate);
+    }
+}