Move classes and functions to separate files
This commit is contained in:
parent
a458c2ed47
commit
5127b0f394
25
Reddit.own
Normal file
25
Reddit.own
Normal file
@ -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()
|
||||||
|
}
|
35
database.own
Normal file
35
database.own
Normal file
@ -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()
|
||||||
|
}
|
@ -2,99 +2,16 @@
|
|||||||
// include "config.own"
|
// include "config.own"
|
||||||
|
|
||||||
use ["std", "math", "http", "json", "functional", "files", "jdbc"]
|
use ["std", "math", "http", "json", "functional", "files", "jdbc"]
|
||||||
|
conn = getConnection("jdbc:sqlite:redditimages.db")
|
||||||
include "own-modules/telegram-bot/TelegramBot.own"
|
include "own-modules/telegram-bot/TelegramBot.own"
|
||||||
|
include "Reddit.own"
|
||||||
|
include "database.own"
|
||||||
|
|
||||||
bot = new TelegramBot(config.token)
|
bot = new TelegramBot(config.token)
|
||||||
|
reddit = new Reddit()
|
||||||
|
|
||||||
// Reddit
|
subreddits = reddit.fetchSubreddits(config.subreddits, config["items-in-top"])
|
||||||
def fetchSubreddit(subreddit) {
|
media = stream(subreddits)
|
||||||
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(
|
|
||||||
"<a href=\"%s\">%s</a>\n" +
|
|
||||||
"<a href=\"https://reddit.com%s\">🗨 Comments</a>%s",
|
|
||||||
safe(post.url),
|
|
||||||
safe(post.title),
|
|
||||||
safe(post.permalink),
|
|
||||||
tag
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
media = stream(fetchAll(config.subreddits))
|
|
||||||
.filter(def(p) = reduce([".jpg", ".png"], false, def(acc, ext) = acc || indexOf(p.url, ext) > 0))
|
.filter(def(p) = reduce([".jpg", ".png"], false, def(acc, ext) = acc || indexOf(p.url, ext) > 0))
|
||||||
.filter(::isPostUnique)
|
.filter(::isPostUnique)
|
||||||
//.peek(def(p) = bot.sendPhoto(config.peer, p.url))
|
//.peek(def(p) = bot.sendPhoto(config.peer, p.url))
|
||||||
@ -118,10 +35,34 @@ stIsPostExists.close()
|
|||||||
stAddPost.close()
|
stAddPost.close()
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
|
// Helpers
|
||||||
def debug(r) {
|
def debug(r) {
|
||||||
// echo(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(
|
||||||
|
"<a href=\"%s\">%s</a>\n" +
|
||||||
|
"<a href=\"https://reddit.com%s\">🗨 Comments</a>%s",
|
||||||
|
safe(post.url),
|
||||||
|
safe(post.title),
|
||||||
|
safe(post.permalink),
|
||||||
|
tag
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
sleep(10)
|
sleep(10)
|
||||||
use "java"
|
use "java"
|
||||||
System = newClass("java.lang.System")
|
System = newClass("java.lang.System")
|
||||||
|
Loading…
Reference in New Issue
Block a user