Browse Source

tgbot:activeProposals: ignore failing proposals

Joystream Stats 3 years ago
parent
commit
a0edc06d3f

+ 15 - 17
scripts/joystreamtelegrambot/src/bot.ts

@@ -40,7 +40,7 @@ let discordChannels: { [key: string]: any } = {};
 const client = new Client();
 client.login(discordToken);
 client.on("ready", async () => {
-  if (!client.user) return;
+  if (!client.user) return console.error(`Empty discord user.`);
   console.log(`Logged in to discord as ${client.user.tag}!`);
   discordChannels.council = await findDiscordChannel("council");
   discordChannels.proposals = await findDiscordChannel("proposals-bot");
@@ -71,9 +71,7 @@ const findDiscordChannel = (name: string) =>
 
 client.on("message", async (msg) => {
   const user = msg.author;
-  if (msg.content === "/status") {
-    msg.reply(`reporting to discord`);
-  }
+  if (msg.content === "/status") msg.reply(`${user}, reporting to discord.`);
 });
 
 bot?.on("message", (msg: TelegramBot.Message) => {
@@ -100,25 +98,24 @@ const sendMessage = (
   msg: { tg: string; tgParseMode: ParseMode | undefined; discord: string },
   channel: any
 ) => {
-  if (msg.tg === "") return;
-  sendDiscord(msg.discord, channel);
-  sendTelegram(msg.tg, msg.tgParseMode);
+  if (msg.discord.length) sendDiscord(msg.discord, channel);
+  if (msg.tg.length) sendTelegram(msg.tg, msg.tgParseMode);
 };
 const sendTelegram = (msg: string, tgParseMode: ParseMode | undefined) => {
-  try {
-    if (bot)
+  if (bot) {
+    try {
       bot.sendMessage(chatid, msg, { parse_mode: tgParseMode || "HTML" });
-    else console.log(msg);
-  } catch (e) {
-    console.log(`Failed to send to telegram: ${e}`);
-  }
+    } catch (e) {
+      console.log(`Failed to send to telegram: ${e}`);
+    }
+  } else console.log(msg);
 };
 const sendDiscord = (msg: string, channel: any) => {
-  if (!channel || !msg.length) return;
+  if (!channel) return;
   try {
     channel.send(msg);
   } catch (e) {
-    console.log(e);
+    console.log(`Failed to send to discord: ${e.message}`);
   }
 };
 
@@ -170,6 +167,7 @@ const main = async () => {
   }
 
   if (opts.proposals) {
+    console.log(`updating proposals`);
     proposals.last = await get.proposalCount(api);
     proposals.active = await get.activeProposals(api, proposals.last);
   }
@@ -267,7 +265,7 @@ const main = async () => {
         created.map(({ event }) =>
           get
             .proposalDetail(api, Number(event.data[1]))
-            .then((proposal: ProposalDetail) =>
+            .then((proposal: ProposalDetail | undefined) =>
               announce.proposalCreated(
                 proposal,
                 sendMessage,
@@ -293,7 +291,7 @@ const main = async () => {
           seen.push(proposalId);
           get
             .proposalDetail(api, proposalId)
-            .then((proposal: ProposalDetail) =>
+            .then((proposal: ProposalDetail | undefined) =>
               announce.proposalUpdated(
                 proposal,
                 id,

+ 5 - 3
scripts/joystreamtelegrambot/src/lib/announcements.ts

@@ -295,15 +295,16 @@ export const posts = async (
 };
 
 export const proposalCreated = (
-  proposal: ProposalDetail,
+  proposal: ProposalDetail | undefined,
   sendMessage: Send,
   channel: any
 ): void => {
+  if (!proposal) return;
   const { id, createdAt, finalizedAt, message, parameters, result } = proposal;
   if (!createdAt) return console.warn(`proposalCreated: wrong data`, proposal);
   const votingEndsAt = createdAt + parameters.votingPeriod.toNumber();
   const endTime = moment()
-    .add(6 * (votingEndsAt - id), "second")
+    .add(6 * parameters.votingPeriod.toNumber(), "second")
     .format("DD/MM/YYYY HH:mm");
   const link = `${domain}/#/proposals/${id}`;
   const tg = `<a href="${link}">Proposal ${id}</a> <b>created</b> at block ${createdAt}.\r\n${message.tg}\r\nYou can <a href="${link}">vote</a> until block ${votingEndsAt} (${endTime} UTC).`;
@@ -312,11 +313,12 @@ export const proposalCreated = (
 };
 
 export const proposalUpdated = (
-  proposal: ProposalDetail,
+  proposal: ProposalDetail | undefined,
   blockId: number,
   sendMessage: Send,
   channel: any
 ): void => {
+  if (!proposal) return;
   const { id, finalizedAt, message, parameters, result, stage } = proposal;
   const link = `${domain}/#/proposals/${id}`;
   if (stage === "Finalized") {

+ 25 - 5
scripts/joystreamtelegrambot/src/lib/getters.ts

@@ -66,11 +66,23 @@ export const activeProposals = async (
   api: Api,
   last: number
 ): Promise<number[]> => {
-  const count = Number(await api.query.proposalsEngine.activeProposalCount());
+  let count = 0;
+  try {
+    console.log(`fetching active proposal count`);
+    count = Number(await api.query.proposalsEngine.activeProposalCount());
+  } catch (e) {
+    console.error(`failed to fetch active proposal count: ${e.message}`);
+  }
   let ids: number[] = [];
   for (let id = last; ids.length < count; id--) {
-    const proposal = await proposalDetail(api, id);
-    if (proposal.result === "Pending") ids.push(id);
+    if ([837, 839].includes(id)) continue;
+    try {
+      console.log(`fetching proposal ${id}`);
+      const proposal = await proposalDetail(api, id);
+      if (proposal && proposal.result === "Pending") ids.push(id);
+    } catch (e) {
+      console.error(`Failed to fetch proposal ${id}: ${e.message}`);
+    }
   }
   return ids;
 };
@@ -85,9 +97,17 @@ const getProposalType = async (api: Api, id: number): Promise<string> => {
 export const proposalDetail = async (
   api: Api,
   id: number
-): Promise<ProposalDetail> => {
-  const proposal: Proposal = await api.query.proposalsEngine.proposals(id);
+): Promise<ProposalDetail | undefined> => {
+  let proposal: Proposal;
+  try {
+    proposal = await api.query.proposalsEngine.proposals(id);
+    if (!proposal) return;
+  } catch (e) {
+    console.log(`Failed to fetch proposal detail ${id}`);
+    return;
+  }
   const status: { [key: string]: any } = proposal.status;
+  if (!status) return;
   const stage: string = status.isActive ? "Active" : "Finalized";
   const { finalizedAt, proposalStatus } = status[`as${stage}`];
   const result: string = proposalStatus