[Claude Haiki] Update to new, working Crystal version

Signed-off-by: Danila Fedorin <danila.fedorin@gmail.com>
This commit is contained in:
2025-12-25 17:35:59 -08:00
parent 59365e658b
commit 97668ba0d7
3 changed files with 48 additions and 24 deletions

View File

@@ -16,6 +16,6 @@ dependencies:
sqlite3: sqlite3:
github: crystal-lang/crystal-sqlite3 github: crystal-lang/crystal-sqlite3
crystal: 0.24.1 crystal: 1.0.0
license: MIT license: MIT

View File

@@ -1,5 +1,5 @@
require "./joann-pupper-bot/*" require "./joann-pupper-bot/*"
require "logger" require "log"
require "telepathy" require "telepathy"
require "time" require "time"
require "sqlite3" require "sqlite3"
@@ -12,14 +12,22 @@ CHATID_DANIEL = 220888832_i64
DATABASE_URL = "sqlite3://./data.sqlite" DATABASE_URL = "sqlite3://./data.sqlite"
BOT_TOKEN = "599474797:AAEmjQNO32uqurI16blS9FT4OoO7GdUZ6h0" BOT_TOKEN = "599474797:AAEmjQNO32uqurI16blS9FT4OoO7GdUZ6h0"
EXTENSIONS = ["png", "jpeg", "jpg"] EXTENSIONS = ["png", "jpeg", "jpg"]
LOGGER = Logger.new(STDOUT) LOGGER = Log.for("joann-pupper-bot")
class BotConfiguration class BotConfiguration
JSON.mapping( include JSON::Serializable
subreddits: Array(String),
send_cron: String, @[JSON::Field(key: "subreddits")]
refresh_cron: String, property subreddits : Array(String)
recepients: Array(Int64))
@[JSON::Field(key: "send_cron")]
property send_cron : String
@[JSON::Field(key: "refresh_cron")]
property refresh_cron : String
@[JSON::Field(key: "recepients")]
property recepients : Array(Int64)
def initialize def initialize
@subreddits = [ "rarepuppers" ] @subreddits = [ "rarepuppers" ]
@@ -75,12 +83,12 @@ class PupperBot
unsent_query = "select id, title, url from posts where not exists (select * from recepient_posts where recepient=? and post=id) limit 1" unsent_query = "select id, title, url from posts where not exists (select * from recepient_posts where recepient=? and post=id) limit 1"
unless to_send = @db.query_one? unsent_query, chatid, as: { Int64, String, String } unless to_send = @db.query_one? unsent_query, chatid, as: { Int64, String, String }
LOGGER.info "Unable to find a post to send to #{chatid}." LOGGER.info { "Unable to find a post to send to #{chatid}." }
return return
end end
id, title, url = to_send id, title, url = to_send
LOGGER.info "Using URL #{url} for request from #{chatid}" LOGGER.info { "Using URL #{url} for request from #{chatid}" }
@db.exec "insert into recepient_posts(recepient, post) values(?, ?)", chatid, id @db.exec "insert into recepient_posts(recepient, post) values(?, ?)", chatid, id
@telegram_bot.send_photo(chatid, url, title) @telegram_bot.send_photo(chatid, url, title)
end end
@@ -93,13 +101,13 @@ class PupperBot
def update_database def update_database
unless response = RedditResponse.from_subreddits(@configuration.subreddits) unless response = RedditResponse.from_subreddits(@configuration.subreddits)
LOGGER.info "Unable to find more posts for the database" LOGGER.info { "Unable to find more posts for the database" }
return return
end end
posts = response.data.posts_matching { |post| EXTENSIONS.any? { |it| post.url.ends_with? it } } posts = response.data.posts_matching { |post| EXTENSIONS.any? { |it| post.url.ends_with? it } }
posts.each do |post| posts.each do |post|
LOGGER.info "Trying to save post #{post.title} #{post.url}" LOGGER.info { "Trying to save post #{post.title} #{post.url}" }
begin begin
@db.exec "insert into posts(title, url) values(?, ?)", post.title, post.url @db.exec "insert into posts(title, url) values(?, ?)", post.title, post.url
rescue rescue

View File

@@ -1,24 +1,40 @@
require "http/client" require "http/client"
require "json" require "json"
class RedditWrapper(T) class RedditWrapper(T)
JSON.mapping( include JSON::Serializable
kind: String,
data: T) @[JSON::Field(key: "kind")]
property kind : String
@[JSON::Field(key: "data")]
property data : T
end end
class RedditChild class RedditChild
JSON.mapping( include JSON::Serializable
url: String,
name: String, @[JSON::Field(key: "url")]
title: String) property url : String
@[JSON::Field(key: "name")]
property name : String
@[JSON::Field(key: "title")]
property title : String
end end
class RedditResponse class RedditResponse
JSON.mapping( include JSON::Serializable
modhash: String,
dist: Int32, @[JSON::Field(key: "modhash")]
children: Array(RedditWrapper(RedditChild))) property modhash : String
@[JSON::Field(key: "dist")]
property dist : Int32
@[JSON::Field(key: "children")]
property children : Array(RedditWrapper(RedditChild))
def self.from_subreddits(subreddits : Array(String)) def self.from_subreddits(subreddits : Array(String))
request_url = URI.new scheme: "https", host: "www.reddit.com", path: "/r/#{subreddits.join "+"}/hot.json", query: "limit=30" request_url = URI.new scheme: "https", host: "www.reddit.com", path: "/r/#{subreddits.join "+"}/hot.json", query: "limit=30"