diff --git a/Reddit.own b/Reddit.own new file mode 100644 index 0000000..e3f32ca --- /dev/null +++ b/Reddit.own @@ -0,0 +1,25 @@ +class Reddit { + def fetchSubreddit(subreddit, maxItems = 5) { + url = "https://www.reddit.com/r/" + subreddit + ".json" + data = sync(def(ret) = http(url, combine(::jsondecode, ret))).data ?? [] + if (!length(data)) return [] + return stream(data.children) + .map(def(child) = child.data) + .limit(min(maxItems, data.dist ?? 0)) + .map(def(post) = { + "id": post.id, + "sub": subreddit, + "url": post.url, + "time": post.created_utc, + "title": post.title, + "permalink": post.permalink, + "flair_text": arrayKeyExists("link_flair_text", post) ? post.link_flair_text : "" + }) + .toArray() + } + + def fetchSubreddits(subreddits, maxItems = 5) = + stream(subreddits) + .flatMap(def(r) = this.fetchSubreddit(r, maxItems)) + .toArray() +} \ No newline at end of file diff --git a/database.own b/database.own new file mode 100644 index 0000000..9f886d9 --- /dev/null +++ b/database.own @@ -0,0 +1,35 @@ +st = conn.createStatement() +st.executeUpdate( + "CREATE TABLE IF NOT EXISTS posts ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + post_id STRING NOT NULL, + subreddit STRING NOT NULL, + url STRING NOT NULL, + created_at INTEGER NOT NULL, + sent_at INTEGER NOT NULL + )") +st.executeUpdate( + "CREATE UNIQUE INDEX IF NOT EXISTS url_idx ON posts (url)") +st.close() + +stIsPostExists = conn.prepareStatement( + "SELECT COUNT(*) FROM posts + WHERE url = ?") +stAddPost = conn.prepareStatement( + "INSERT INTO posts(post_id, subreddit, url, created_at, sent_at) + VALUES(?, ?, ?, ?, ?)") + +def isPostUnique(post) { + stIsPostExists.setString(1, post.url) + rs = stIsPostExists.executeQuery() + return rs.getInt(1) == 0 +} + +def addPost(post) { + stAddPost.setString(1, post.id) + stAddPost.setString(2, post.sub) + stAddPost.setString(3, post.url) + stAddPost.setLong(4, post.time) + stAddPost.setLong(5, time() / 1000) + stAddPost.executeUpdate() +} \ No newline at end of file diff --git a/redditimages2telegram.own b/redditimages2telegram.own index b447b98..c4842b5 100644 --- a/redditimages2telegram.own +++ b/redditimages2telegram.own @@ -2,102 +2,19 @@ // include "config.own" use ["std", "math", "http", "json", "functional", "files", "jdbc"] +conn = getConnection("jdbc:sqlite:redditimages.db") include "own-modules/telegram-bot/TelegramBot.own" +include "Reddit.own" +include "database.own" bot = new TelegramBot(config.token) +reddit = new Reddit() -// Reddit -def fetchSubreddit(subreddit) { - url = "https://www.reddit.com/r/" + subreddit + ".json" - data = sync(def(ret) = http(url, combine(::jsondecode, ret))).data ?? [] - if (!length(data)) return [] - return stream(data.children) - .map(def(child) = child.data) - .limit(min(config["items-in-top"], data.dist ?? 0)) - .map(def(post) = { - "id": post.id, - "sub": subreddit, - "url": post.url, - "time": post.created_utc, - "title": post.title, - "permalink": post.permalink, - "flair_text": arrayKeyExists("link_flair_text", post) ? post.link_flair_text : "" - }) - .toArray() -} -def fetchAll(subreddits) = - stream(subreddits) - .flatMap(::fetchSubreddit) - .toArray() - -// Database -conn = getConnection("jdbc:sqlite:redditimages.db") -st = conn.createStatement() -st.executeUpdate( - "CREATE TABLE IF NOT EXISTS posts ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - post_id STRING NOT NULL, - subreddit STRING NOT NULL, - url STRING NOT NULL, - created_at INTEGER NOT NULL, - sent_at INTEGER NOT NULL - )") -st.executeUpdate( - "CREATE UNIQUE INDEX IF NOT EXISTS url_idx ON posts (url)") -st.close() - -stIsPostExists = conn.prepareStatement( - "SELECT COUNT(*) FROM posts - WHERE url = ?") -stAddPost = conn.prepareStatement( - "INSERT INTO posts(post_id, subreddit, url, created_at, sent_at) - VALUES(?, ?, ?, ?, ?)") - -def isPostUnique(post) { - stIsPostExists.setString(1, post.url) - rs = stIsPostExists.executeQuery() - return rs.getInt(1) == 0 -} - -def addPost(post) { - stAddPost.setString(1, post.id) - stAddPost.setString(2, post.sub) - stAddPost.setString(3, post.url) - stAddPost.setLong(4, post.time) - stAddPost.setLong(5, time() / 1000) - stAddPost.executeUpdate() -} - -// Helpers -def strToHashtag(str) = - str.toLowerCase() - .replaceAll("[^a-z_0-9\s]", "") - .replaceAll("\s+", "_") - -def safe(str) = str.replace("&", "&") - .replace("<", "<").replace(">", ">") - - -def getCaption(post) { - tag = "" - if (length(post.flair_text) > 0) { - tag = " #" + strToHashtag(post.sub + "_" + post.flair_text) - } - return sprintf( - "%s\n" + - "🗨 Comments%s", - safe(post.url), - safe(post.title), - safe(post.permalink), - tag - ) -} - - -media = stream(fetchAll(config.subreddits)) +subreddits = reddit.fetchSubreddits(config.subreddits, config["items-in-top"]) +media = stream(subreddits) .filter(def(p) = reduce([".jpg", ".png"], false, def(acc, ext) = acc || indexOf(p.url, ext) > 0)) .filter(::isPostUnique) -// .peek(def(p) = bot.sendPhoto(config.peer, p.url)) + //.peek(def(p) = bot.sendPhoto(config.peer, p.url)) .peek(::addPost) .map(def(p) = { "type": "photo", @@ -118,10 +35,34 @@ stIsPostExists.close() stAddPost.close() conn.close() +// Helpers def debug(r) { // echo(r) } +def strToHashtag(str) = + str.toLowerCase() + .replaceAll("[^a-z_0-9\s]", "") + .replaceAll("\s+", "_") + +def safe(str) = str.replace("&", "&") + .replace("<", "<").replace(">", ">") + +def getCaption(post) { + tag = "" + if (length(post.flair_text) > 0) { + tag = " #" + strToHashtag(post.sub + "_" + post.flair_text) + } + return sprintf( + "%s\n" + + "🗨 Comments%s", + safe(post.url), + safe(post.title), + safe(post.permalink), + tag + ) +} + sleep(10) use "java" System = newClass("java.lang.System")