[08] 回声多个 media 讯息

判断多个讯息

主要是多了一个 media_group_id

然後多个 media 会分别 post 进来所以需要存下来

所以建一个变数来存

然後确定全部传进来後再回传

const { sendBotMessage } = require("./telegramItem");

function receiveTelegram(data) {
  if ("media_group_id" in data.message) {
    multitudeForwardHandler(data);
  } else {
    data = parseDataToTelegram(data);
    sendBotMessage(data);
  }
}

/**
 * @description 用来分析与转换对应的讯息类型
 *
 * @param {*} estringa
 * @return {*}
 */
function parseDataToTelegram(estringa) {
  var payload = {};
  if (estringa.message.text) {
    payload = {
      method: "sendMessage",
      text: estringa.message.text,
    };
  } else if (estringa.message.sticker) {
    payload = {
      method: "sendSticker",
      sticker: estringa.message.sticker.file_id,
    };
  } else if (estringa.message.photo) {
    array = estringa.message.photo;
    text = array[1];
    payload = {
      method: "sendPhoto",
      photo: text.file_id,
      caption: estringa.message.caption ? estringa.message.caption : "",
    };
  } else if (estringa.message.video) {
    vidoe = estringa.message.video;
    payload = {
      method: "sendVideo",
      video: vidoe.file_id,
      caption: estringa.message.caption ? estringa.message.caption : "",
    };
  } else if (estringa.message.animation) {
    animation = estringa.message.animation;
    payload = {
      method: "sendAnimation",
      animation: animation.file_id,
      caption: estringa.message.caption ? estringa.message.caption : "",
    };
  }
  payload.chat_id = estringa.message.chat.id;
  return payload;
}

// 用来存放多个 media 用的
let multitudeSendData = {};

/**
 * @description 多个 media 讯息会以这种形式传送
 *
 * @param {*} estringa
 */
function multitudeForwardHandler(estringa) {
  let object = {
    type: checkTelegramMessageType(estringa.message),
    media:
      estringa.message.video?.file_id || estringa.message?.photo[1].file_id,
    caption: estringa.message.caption ? estringa.message.caption : "",
  };
  // 当不同 group id 传来就 reset
  if (!multitudeSendData[estringa.message.media_group_id]) {
    multitudeSendData[estringa.message.media_group_id] = {
      timeout: null,
      data: [],
    };
  }
  multitudeSendData[estringa.message.media_group_id].data.push(object);

  clearTimeout(multitudeSendData[estringa.message.media_group_id].timeout);
  multitudeSendData[estringa.message.media_group_id].timeout = setTimeout(
    () => {
      sendBotMessage({
        chat_id: estringa.message.chat.id,
        method: "sendMediaGroup",
        media: JSON.stringify(
          multitudeSendData[estringa.message.media_group_id].data
        ),
      });
    },
    1000
  );
}

/**
 * @description 用来分影片和照片
 *
 * @param {*} message
 * @return {*}
 */
function checkTelegramMessageType(message) {
  let type;
  if (message.photo) {
    type = "photo";
  } else if (message.video) {
    type = "video";
  }
  return type;
}

module.exports = {
  receiveTelegram,
};

到这边服务器还是很容易坏掉因为还有其他讯息

下一篇会过滤掉除了回声讯息以外的请求

day08


<<:  Day15-有关系就没关系 Deployment 和 ReplicaSet(二)

>>:  Day8. 依点成形,创造物件 - RigidBody(下)

Day 25 -资料库应用小程序 创建资料库

从我们上一篇设计出的实体关系模型 ( Entity - Relationship Model, E-...

[Day15]C# 鸡础观念- 多笔资料的好朋友~List

我们曾经认识过阵列(array), 今天来介绍他的兄弟List吧 List< T > T...

【Day 27】NumPy (4):np.sqrt(), np.square()

前言 今天要来介绍一下用於数学运算的函式,sqrt 开根号,以及 square 平方 NumPy n...

Snapshot API测试

接下来照着永丰提供的github, 下一个要使用到的是快照-Snapshot的部分, 简单来说就是当...

理解 HTTP(三):透过 HTTP 上网安全吗?浅谈网路安全、HTTPS、中间人攻击

聊了 HTTP 的基本概念(网站内容是怎麽被下载到电脑里的?、Method、Status Code)...