Pārlūkot izejas kodu

get first media tweet from newly subscribed feeds

Mike L 4 gadi atpakaļ
vecāks
revīzija
a4fdc4ef54
3 mainītis faili ar 40 papildinājumiem un 10 dzēšanām
  1. 18 6
      dist/twitter.js
  2. 11 0
      src/model.d.ts
  3. 11 4
      src/twitter.ts

+ 18 - 6
dist/twitter.js

@@ -63,6 +63,8 @@ class default_1 {
                     const offset = lock.threads[currentFeed].offset;
                     if (offset > 0)
                         config.since_id = offset;
+                    if (offset < -1)
+                        config.max_id = offset.slice(1);
                     this.client.get(endpoint, config, (error, tweets, response) => {
                         if (error) {
                             if (error instanceof Array && error.length > 0 && error[0].code === 34) {
@@ -91,19 +93,29 @@ class default_1 {
                     return;
                 }
                 const topOfFeed = tweets[0].id_str;
-                const updateOffset = () => currentThread.offset = topOfFeed;
+                logger.info(`current offset: ${currentThread.offset}, current top of feed: ${topOfFeed}`);
+                const bottomOfFeed = tweets[tweets.length - 1].id_str;
+                const setOffset = (offset) => currentThread.offset = offset;
+                const updateOffset = () => setOffset(topOfFeed);
                 tweets = tweets.filter(twi => !twi.retweeted_status && twi.extended_entities);
-                if (tweets.length === 0) {
-                    updateDate();
+                logger.info(`found ${tweets.length} tweets with extended entities`);
+                if (currentThread.offset === '-1') {
                     updateOffset();
                     return;
                 }
-                if (currentThread.offset === '-1') {
+                if (currentThread.offset <= 0) {
+                    if (tweets.length === 0) {
+                        setOffset('-' + bottomOfFeed);
+                        lock.workon--;
+                        return;
+                    }
+                    tweets.splice(1);
+                }
+                if (tweets.length === 0) {
+                    updateDate();
                     updateOffset();
                     return;
                 }
-                if (currentThread.offset === '0')
-                    tweets.splice(1);
                 const maxCount = 3;
                 let sendTimeout = 10000;
                 const retryTimeout = 1500;

+ 11 - 0
src/model.d.ts

@@ -16,6 +16,17 @@ interface ILock {
   threads: {
     [key: string]:
       {
+        /**
+         * Offset for next timeline query.
+         *
+         * @description definition changes:
+         * - -1: initial value for existing feeds after program start
+         * - 0: initial value for new feeds right after subscription
+         * - positive offset: starting/minimum tweet ID (exclusive) for next query
+         * - negative offset: (inverse of) ending/maximum tweet ID (inclusive) for next query
+         *
+         * The type is now string to avoid losing accuracy for big integers.
+         */
         offset: string,
         updatedAt: string,
         subscribers: IChat[],

+ 11 - 4
src/twitter.ts

@@ -126,6 +126,7 @@ export default class {
       if (endpoint) {
         const offset = lock.threads[currentFeed].offset as unknown as number;
         if (offset > 0) config.since_id = offset;
+        if (offset < -1) config.max_id = (offset as unknown as string).slice(1) as unknown as number;
         this.client.get(endpoint, config, (error, tweets, response) => {
           if (error) {
             if (error instanceof Array && error.length > 0 && error[0].code === 34) {
@@ -151,12 +152,18 @@ export default class {
       if (!tweets || tweets.length === 0) { updateDate(); return; }
 
       const topOfFeed = tweets[0].id_str;
-      const updateOffset = () => currentThread.offset = topOfFeed;
+      logger.info(`current offset: ${currentThread.offset}, current top of feed: ${topOfFeed}`);
+      const bottomOfFeed = tweets[tweets.length - 1].id_str;
+      const setOffset = (offset: string) => currentThread.offset = offset;
+      const updateOffset = () => setOffset(topOfFeed);
       tweets = tweets.filter(twi => !twi.retweeted_status && twi.extended_entities);
-      if (tweets.length === 0) { updateDate(); updateOffset(); return; }
-
+      logger.info(`found ${tweets.length} tweets with extended entities`);
       if (currentThread.offset === '-1') { updateOffset(); return; }
-      if (currentThread.offset === '0') tweets.splice(1);
+      if (currentThread.offset as unknown as number <= 0) {
+        if (tweets.length === 0) { setOffset('-' + bottomOfFeed); lock.workon--; return; }
+        tweets.splice(1);
+      }
+      if (tweets.length === 0) { updateDate(); updateOffset(); return; }
 
       const maxCount = 3;
       let sendTimeout = 10000;