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")