Skip to content

Latest commit

 

History

History
158 lines (121 loc) · 3.32 KB

File metadata and controls

158 lines (121 loc) · 3.32 KB

File structure

  • apis
    • bots
      • TelegramBot
    • handlers
      • VkHandler
    • TelegramApi
    • VkApi
  • interfaces
    • Bot - QThread
    • Model
    • Task
    • User - Abstraction for storing user ids
  • models
    • Attachment - Photos, Videos, Music, etc.
    • Error
    • Post
    • Posts
    • Status
  • queue
    • QueueHandler - Interface
    • QueueManager
    • QueueTask
  • tasks
    • TaskManager - create and manage tasks
    • vk
      • PostsVkTask - Fetch last posts from user subscriptions
  • tests - Temporary storage for test code, before i learn any testing framework
  • utils
    • concurrent
      • UFuture - report about finished task and return value from another thread
    • USingleton
    • Utils
  • vendor
    • cotire - Unity builds (All cpp files compiled as one)
    • tgbot-cpp - Telegram Bot API library
    • verdigris - Replacement for MOC (Needed for unity builds)
  • Runner - keeper of pointers to Queue, Bots and Api's
  • Storage - json storage
  • vars - secure variables: tokens, etc.
  • vars.h.example - template for secure variables
  • main

Storage

I think permanent storage of posts isn't needed, so i will store them in memory, and delete after send is finished.

{
    "task.vk.posts": {
        "last_ids": {
            "group_id": "post_id"
        }
    },
    "tasks": {
        "last_launched": {
            "task.vk.posts": timestamp
        }
    },
    "vk": {
        "group_names": {
            "group_id": "group_name"
        },
        "groups": {
            "TUser": [
                "group name 1",
                "group name 2",
                "group name 3"
            ]
        },
        "tokens": {
            "TUser": "access token"
        }
    }
}

Models

User is universal user_id storage. Each bot should have separate constructor and add prefix to id, for methods like isTelegram to work. Model method sendTo(User) decides to which Export send itself, and will add task for it.

TODO

Handle errors, and logs (write to temp file, send to "admin" user)

Conventions

Any method that writes to Storage should call save after last write or at end of function

Network

SSL certificates are downloaded from https://curl.haxx.se/ca/cacert.pem , and stored in app folder as cacert.pem

Singletons

  • Runner
  • Storage

VK

Code for stored procedure execute.fetchLastPostFrom. Can take only 20 groups

var POSTS_COUNT = 7;

var group_ids = Args.group_ids.split(",");
var post_ids_joined = Args.post_ids.split(",");

var ig = 1, groups_count = group_ids.length;
var r = [];

while (ig < groups_count) {
    var group_id = group_ids[ig];
    var posts;
    var ip = 0;

    if (group_id.substr(0,1) == "-") {
        posts = API.wall.get({count: POSTS_COUNT, filter: "owner", v: "5.92", owner_id: group_id}).items;
    } else {
        posts = API.wall.get({count: POSTS_COUNT, filter: "owner", v: "5.92", domain: group_id}).items;
    }

    var posts_count = posts.length;
    var post_ids = post_ids_joined[ig - 1];

    if (post_ids.length > 0) {
        post_ids = post_ids.split(":");
    } else {
        post_ids = [];
    }

    while (ip < posts_count) {
        var post = posts[ip];

        if (post_ids.indexOf(post.id + "") == -1 && post.is_pinned != 1) {
            post.domain = group_id;
            r.push(post);
        }

        ip = ip + 1;
    }

    ig = ig + 1;
};

return r;