diff options
Diffstat (limited to 'src/helpers.cr')
| -rw-r--r-- | src/helpers.cr | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/helpers.cr b/src/helpers.cr index 33035d60..2e2d9de4 100644 --- a/src/helpers.cr +++ b/src/helpers.cr @@ -79,6 +79,15 @@ class ChannelVideo }) end +class User + add_mapping({ + id: String, + updated: Time, + notifications: Int32, + subscriptions: Array(String), + }) +end + class RedditSubmit JSON.mapping({ data: RedditSubmitData, @@ -545,3 +554,40 @@ def fetch_channel(id, client, db) return channel end + +def get_user(sid, client, headers, db) + if db.query_one?("SELECT EXISTS (SELECT true FROM users WHERE id = $1)", sid, as: Bool) + user = db.query_one("SELECT * FROM users WHERE id = $1", sid, as: User) + + if Time.now - user.updated > 1.minutes + user = fetch_user(sid, client, headers) + user_array = user.to_a + args = arg_array(user_array) + + db.exec("INSERT INTO users VALUES (#{args}) \ + ON CONFLICT (id) DO UPDATE SET updated = $2, subscriptions = $4", user_array) + end + else + user = fetch_user(sid, client, headers) + args = arg_array(user.to_a) + db.exec("INSERT INTO users VALUES (#{args})", user.to_a) + end + + return user +end + +def fetch_user(sid, client, headers) + feed = client.get("/subscription_manager?action_takeout=1", headers).body + + channels = [] of String + feed = XML.parse_html(feed) + feed.xpath_nodes("//opml/outline/outline").each do |channel| + id = channel["xmlurl"][-24..-1] + get_channel(id, client, PG_DB) + + channels << id + end + + user = User.new(sid, Time.now, 0, channels) + return user +end |
