bluesky initial impl

This commit is contained in:
Dylan Knutson
2025-08-05 18:08:48 +00:00
parent 6b8fce7ddc
commit e9f3b0e822
18 changed files with 10293 additions and 6 deletions

View File

@@ -19,6 +19,8 @@ module Domain::DomainModelHelper
"Inkbunny"
when Domain::DomainType::Sofurry
"Sofurry"
when Domain::DomainType::Bluesky
"Bluesky"
end
end
@@ -33,6 +35,8 @@ module Domain::DomainModelHelper
"IB"
when Domain::DomainType::Sofurry
"SF"
when Domain::DomainType::Bluesky
"BSKY"
end
end
end

View File

@@ -6,5 +6,6 @@ class Domain::DomainType < T::Enum
E621 = new
Inkbunny = new
Sofurry = new
Bluesky = new
end
end

View File

@@ -0,0 +1,149 @@
# typed: strict
class Domain::Post::BlueskyPost < Domain::Post
aux_table :bluesky, allow_redefining: :title
belongs_to :first_seen_entry, class_name: "::HttpLogEntry", optional: true
has_single_file!
has_single_creator! Domain::User::BlueskyUser
has_faving_users! Domain::User::BlueskyUser
after_initialize { self.state ||= "ok" if new_record? }
enum :state,
{
ok: "ok",
removed: "removed",
scan_error: "scan_error",
file_error: "file_error",
},
prefix: "state"
validates :state, presence: true
validates :bluesky_id, presence: true
sig { override.returns([String, Symbol]) }
def self.param_prefix_and_attribute
["bsky", :bluesky_id]
end
sig { override.returns(String) }
def self.view_prefix
"bsky"
end
sig { override.returns(Symbol) }
def self.post_order_attribute
:bluesky_id
end
sig { override.returns(Domain::DomainType) }
def self.domain_type
Domain::DomainType::Bluesky
end
sig { override.returns(T.nilable(Domain::User)) }
def primary_creator_for_view
self.creator
end
sig { override.returns(T.nilable(T.any(String, Integer))) }
def domain_id_for_view
self.bluesky_id
end
sig { override.returns(T.nilable(Addressable::URI)) }
def external_url_for_view
handle = self.creator&.handle
if bluesky_id.present? && handle.present?
Addressable::URI.parse(
"https://bsky.app/profile/#{handle}/post/#{bluesky_id}",
)
end
end
sig { override.returns(T.nilable(Domain::PostFile)) }
def primary_file_for_view
self.file
end
sig { override.returns(T::Boolean) }
def pending_scan?
scanned_at.nil?
end
sig { override.returns(T.nilable(String)) }
def description_html_for_view
text
end
sig { override.returns(String) }
def description_html_base_domain
"bsky.app"
end
sig { override.returns(T.nilable(String)) }
def description_for_view
self.text
end
sig { override.returns(T.nilable(Integer)) }
def num_favorites_for_view
like_count
end
sig { override.returns(T.nilable(String)) }
def title
# Use first 50 characters of text as title, or a fallback
current_text = text
current_text.present? ? current_text.truncate(50) : "Bluesky Post"
end
sig { returns(T.nilable(String)) }
def status_for_view
case self.state
when "ok"
"OK"
when "removed"
"Removed"
when "scan_error"
"Scan error"
when "file_error"
"File error"
end
end
sig do
params(
at_uri: String,
creator: Domain::User::BlueskyUser,
first_seen_log_entry: T.nilable(HttpLogEntry),
).returns(Domain::Post::BlueskyPost)
end
def self.find_or_initialize_by_at_uri(
at_uri,
creator:,
first_seen_log_entry: nil
)
# Extract the record key (post ID) from AT URI
# e.g., "at://did:plc:abc123/app.bsky.feed.post/xyz789" -> "xyz789"
bluesky_id = at_uri.split("/").last
post =
Domain::Post::BlueskyPost.find_or_initialize_by(
bluesky_id: bluesky_id,
) do |post|
post.first_seen_entry = first_seen_log_entry
post.at_uri = at_uri
end
post.creator ||= creator
post
end
sig { override.returns(T.nilable(T::Array[TagForView])) }
def tags_for_view
return nil unless hashtags.present?
hashtags.map { |tag| TagForView.new(category: :general, value: tag) }
end
end

View File

@@ -0,0 +1,83 @@
# typed: strict
class Domain::User::BlueskyUser < Domain::User
aux_table :bluesky
due_timestamp :scanned_profile_at, 1.month
due_timestamp :scanned_posts_at, 1.week
has_created_posts! Domain::Post::BlueskyPost
has_faved_posts! Domain::Post::BlueskyPost
enum :state,
{ ok: "ok", account_disabled: "account_disabled", error: "error" },
prefix: :state
validates :handle, presence: true
validates :state, presence: true
after_initialize { self.state ||= "ok" if new_record? }
sig { override.returns([String, Symbol]) }
def self.param_prefix_and_attribute
["bsky", :handle]
end
sig { override.returns(String) }
def self.view_prefix
"bsky"
end
sig { override.returns(Domain::DomainType) }
def self.domain_type
Domain::DomainType::Bluesky
end
sig { override.returns(String) }
def description_html_base_domain
"bsky.app"
end
sig { override.returns(String) }
def site_name_for_view
"Bluesky"
end
sig { override.returns(T.nilable(String)) }
def description_html_for_view
description
end
sig { override.returns(T::Array[String]) }
def names_for_search
[display_name, handle].compact
end
sig { override.returns(T.nilable(String)) }
def external_url_for_view
"https://bsky.app/profile/#{handle}" if handle.present?
end
sig { override.returns(T.nilable(String)) }
def name_for_view
display_name || handle
end
sig { override.returns(String) }
def account_status_for_view
"Active" # TODO: Implement proper status checking
end
sig { returns(String) }
def account_state_for_view
case state
when "ok"
"Ok"
when "account_disabled"
"Disabled"
when "error"
"Error"
else
"Unknown"
end
end
end

View File

@@ -0,0 +1,40 @@
# typed: strict
# frozen_string_literal: true
class AddAuxTablesForDomainUsersBlueskyUsers < ActiveRecord::Migration[7.2]
extend T::Sig
sig { void }
def change
create_aux_table :domain_users, :bluesky do |t|
t.string :handle, null: false, index: true
t.string :display_name
t.text :description
t.string :state, null: false, default: "ok"
# Bluesky-specific fields
t.string :did, index: true # Decentralized identifier
t.string :avatar_url
t.integer :followers_count, default: 0
t.integer :following_count, default: 0
t.integer :posts_count, default: 0
# Scanning timestamps
t.datetime :scanned_profile_at
t.datetime :scanned_posts_at
# Log entries for tracking scans
t.references :last_profile_scan,
foreign_key: {
to_table: :http_log_entries,
}
t.references :last_posts_scan,
foreign_key: {
to_table: :http_log_entries,
}
# Raw data storage for debugging/analysis
t.column :profile_raw, :jsonb, default: {}
end
end
end

View File

@@ -0,0 +1,51 @@
# typed: strict
# frozen_string_literal: true
class AddAuxTablesForDomainPostsBlueskyPosts < ActiveRecord::Migration[7.2]
extend T::Sig
sig { void }
def change
create_aux_table :domain_posts, :bluesky do |t|
t.string :bluesky_id, null: false, index: true # Record key from AT URI
t.string :at_uri, index: true # Full AT Protocol URI
t.text :text # Post content
t.string :state, null: false, default: "ok"
# Post metadata (posted_at is in main table)
t.datetime :scanned_at
t.string :language, limit: 10
# Engagement metrics
t.integer :like_count, default: 0
t.integer :repost_count, default: 0
t.integer :reply_count, default: 0
t.integer :quote_count, default: 0
# Content arrays
t.column :hashtags, :jsonb, default: []
t.column :mentions, :jsonb, default: []
t.column :links, :jsonb, default: []
# References to other posts
t.string :reply_to_uri # AT URI of post being replied to
t.string :quote_uri # AT URI of post being quoted
# Log entries for tracking scans
t.references :last_profile_scan,
foreign_key: {
to_table: :http_log_entries,
}
t.references :first_seen_entry,
foreign_key: {
to_table: :http_log_entries,
}
# Raw data storage for debugging/analysis
t.column :post_raw, :jsonb, default: {}
# Error tracking
t.string :scan_error
end
end
end

View File

@@ -0,0 +1,15 @@
# typed: strict
# frozen_string_literal: true
class RemoveLastProfileScanFromBlueskyPosts < ActiveRecord::Migration[7.2]
extend T::Sig
sig { void }
def change
remove_reference :domain_posts_bluesky_aux,
:last_profile_scan,
foreign_key: {
to_table: :http_log_entries,
}
end
end

View File

@@ -1336,6 +1336,52 @@ CREATE TABLE public.domain_posts (
);
--
-- Name: domain_posts_bluesky_aux; Type: TABLE; Schema: public; Owner: -
--
CREATE TABLE public.domain_posts_bluesky_aux (
base_table_id bigint NOT NULL,
bluesky_id character varying NOT NULL,
at_uri character varying,
text text,
state character varying DEFAULT 'ok'::character varying NOT NULL,
scanned_at timestamp(6) without time zone,
language character varying(10),
like_count integer DEFAULT 0,
repost_count integer DEFAULT 0,
reply_count integer DEFAULT 0,
quote_count integer DEFAULT 0,
hashtags jsonb DEFAULT '[]'::jsonb,
mentions jsonb DEFAULT '[]'::jsonb,
links jsonb DEFAULT '[]'::jsonb,
reply_to_uri character varying,
quote_uri character varying,
first_seen_entry_id bigint,
post_raw jsonb DEFAULT '{}'::jsonb,
scan_error character varying
);
--
-- Name: domain_posts_bluesky_aux_base_table_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--
CREATE SEQUENCE public.domain_posts_bluesky_aux_base_table_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
--
-- Name: domain_posts_bluesky_aux_base_table_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
--
ALTER SEQUENCE public.domain_posts_bluesky_aux_base_table_id_seq OWNED BY public.domain_posts_bluesky_aux.base_table_id;
--
-- Name: domain_posts_e621_aux; Type: TABLE; Schema: public; Owner: -
--
@@ -1827,6 +1873,48 @@ CREATE TABLE public.domain_users (
);
--
-- Name: domain_users_bluesky_aux; Type: TABLE; Schema: public; Owner: -
--
CREATE TABLE public.domain_users_bluesky_aux (
base_table_id bigint NOT NULL,
handle character varying NOT NULL,
display_name character varying,
description text,
state character varying DEFAULT 'ok'::character varying NOT NULL,
did character varying,
avatar_url character varying,
followers_count integer DEFAULT 0,
following_count integer DEFAULT 0,
posts_count integer DEFAULT 0,
scanned_profile_at timestamp(6) without time zone,
scanned_posts_at timestamp(6) without time zone,
last_profile_scan_id bigint,
last_posts_scan_id bigint,
profile_raw jsonb DEFAULT '{}'::jsonb
);
--
-- Name: domain_users_bluesky_aux_base_table_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--
CREATE SEQUENCE public.domain_users_bluesky_aux_base_table_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
--
-- Name: domain_users_bluesky_aux_base_table_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
--
ALTER SEQUENCE public.domain_users_bluesky_aux_base_table_id_seq OWNED BY public.domain_users_bluesky_aux.base_table_id;
--
-- Name: domain_users_e621_aux; Type: TABLE; Schema: public; Owner: -
--
@@ -2956,6 +3044,13 @@ ALTER TABLE ONLY public.domain_post_groups ALTER COLUMN id SET DEFAULT nextval('
ALTER TABLE ONLY public.domain_posts ALTER COLUMN id SET DEFAULT nextval('public.domain_posts_id_seq'::regclass);
--
-- Name: domain_posts_bluesky_aux base_table_id; Type: DEFAULT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.domain_posts_bluesky_aux ALTER COLUMN base_table_id SET DEFAULT nextval('public.domain_posts_bluesky_aux_base_table_id_seq'::regclass);
--
-- Name: domain_posts_e621_aux base_table_id; Type: DEFAULT; Schema: public; Owner: -
--
@@ -3026,6 +3121,13 @@ ALTER TABLE ONLY public.domain_user_search_names ALTER COLUMN id SET DEFAULT nex
ALTER TABLE ONLY public.domain_users ALTER COLUMN id SET DEFAULT nextval('public.domain_users_id_seq'::regclass);
--
-- Name: domain_users_bluesky_aux base_table_id; Type: DEFAULT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.domain_users_bluesky_aux ALTER COLUMN base_table_id SET DEFAULT nextval('public.domain_users_bluesky_aux_base_table_id_seq'::regclass);
--
-- Name: domain_users_e621_aux base_table_id; Type: DEFAULT; Schema: public; Owner: -
--
@@ -3173,6 +3275,14 @@ ALTER TABLE ONLY public.domain_post_groups
ADD CONSTRAINT domain_post_groups_pkey PRIMARY KEY (id);
--
-- Name: domain_posts_bluesky_aux domain_posts_bluesky_aux_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.domain_posts_bluesky_aux
ADD CONSTRAINT domain_posts_bluesky_aux_pkey PRIMARY KEY (base_table_id);
--
-- Name: domain_posts_e621_aux domain_posts_e621_aux_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
@@ -3253,6 +3363,14 @@ ALTER TABLE ONLY public.domain_user_search_names
ADD CONSTRAINT domain_user_search_names_pkey PRIMARY KEY (id);
--
-- Name: domain_users_bluesky_aux domain_users_bluesky_aux_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.domain_users_bluesky_aux
ADD CONSTRAINT domain_users_bluesky_aux_pkey PRIMARY KEY (base_table_id);
--
-- Name: domain_users_e621_aux domain_users_e621_aux_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
@@ -4148,6 +4266,34 @@ CREATE INDEX index_domain_post_group_joins_on_type ON public.domain_post_group_j
CREATE INDEX index_domain_post_groups_on_type ON public.domain_post_groups USING btree (type);
--
-- Name: index_domain_posts_bluesky_aux_on_at_uri; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX index_domain_posts_bluesky_aux_on_at_uri ON public.domain_posts_bluesky_aux USING btree (at_uri);
--
-- Name: index_domain_posts_bluesky_aux_on_base_table_id; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX index_domain_posts_bluesky_aux_on_base_table_id ON public.domain_posts_bluesky_aux USING btree (base_table_id);
--
-- Name: index_domain_posts_bluesky_aux_on_bluesky_id; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX index_domain_posts_bluesky_aux_on_bluesky_id ON public.domain_posts_bluesky_aux USING btree (bluesky_id);
--
-- Name: index_domain_posts_bluesky_aux_on_first_seen_entry_id; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX index_domain_posts_bluesky_aux_on_first_seen_entry_id ON public.domain_posts_bluesky_aux USING btree (first_seen_entry_id);
--
-- Name: index_domain_posts_e621_aux_on_base_table_id; Type: INDEX; Schema: public; Owner: -
--
@@ -4400,6 +4546,41 @@ CREATE UNIQUE INDEX index_domain_user_user_follows_on_from_id_and_to_id ON publi
CREATE INDEX index_domain_user_user_follows_on_to_id_and_from_id ON public.domain_user_user_follows USING btree (to_id, from_id);
--
-- Name: index_domain_users_bluesky_aux_on_base_table_id; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX index_domain_users_bluesky_aux_on_base_table_id ON public.domain_users_bluesky_aux USING btree (base_table_id);
--
-- Name: index_domain_users_bluesky_aux_on_did; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX index_domain_users_bluesky_aux_on_did ON public.domain_users_bluesky_aux USING btree (did);
--
-- Name: index_domain_users_bluesky_aux_on_handle; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX index_domain_users_bluesky_aux_on_handle ON public.domain_users_bluesky_aux USING btree (handle);
--
-- Name: index_domain_users_bluesky_aux_on_last_posts_scan_id; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX index_domain_users_bluesky_aux_on_last_posts_scan_id ON public.domain_users_bluesky_aux USING btree (last_posts_scan_id);
--
-- Name: index_domain_users_bluesky_aux_on_last_profile_scan_id; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX index_domain_users_bluesky_aux_on_last_profile_scan_id ON public.domain_users_bluesky_aux USING btree (last_profile_scan_id);
--
-- Name: index_domain_users_e621_aux_on_base_table_id; Type: INDEX; Schema: public; Owner: -
--
@@ -5282,6 +5463,14 @@ ALTER TABLE ONLY public.domain_twitter_medias
ADD CONSTRAINT fk_rails_278c1d09f0 FOREIGN KEY (tweet_id) REFERENCES public.domain_twitter_tweets(id);
--
-- Name: domain_posts_bluesky_aux fk_rails_2a2f4bfba8; Type: FK CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.domain_posts_bluesky_aux
ADD CONSTRAINT fk_rails_2a2f4bfba8 FOREIGN KEY (base_table_id) REFERENCES public.domain_posts(id);
--
-- Name: domain_users_inkbunny_aux fk_rails_304ea0307f; Type: FK CONSTRAINT; Schema: public; Owner: -
--
@@ -5322,6 +5511,14 @@ ALTER TABLE ONLY public.domain_user_user_follows
ADD CONSTRAINT fk_rails_4b2ab65400 FOREIGN KEY (from_id) REFERENCES public.domain_users(id);
--
-- Name: domain_users_bluesky_aux fk_rails_56b1754cfb; Type: FK CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.domain_users_bluesky_aux
ADD CONSTRAINT fk_rails_56b1754cfb FOREIGN KEY (last_profile_scan_id) REFERENCES public.http_log_entries(id);
--
-- Name: domain_posts_ib_aux fk_rails_5ee2c344bd; Type: FK CONSTRAINT; Schema: public; Owner: -
--
@@ -5338,6 +5535,22 @@ ALTER TABLE ONLY public.domain_twitter_medias
ADD CONSTRAINT fk_rails_5fffa41fa6 FOREIGN KEY (file_id) REFERENCES public.http_log_entries(id);
--
-- Name: domain_users_bluesky_aux fk_rails_673dd1243a; Type: FK CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.domain_users_bluesky_aux
ADD CONSTRAINT fk_rails_673dd1243a FOREIGN KEY (base_table_id) REFERENCES public.domain_users(id);
--
-- Name: domain_posts_bluesky_aux fk_rails_7393623916; Type: FK CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.domain_posts_bluesky_aux
ADD CONSTRAINT fk_rails_7393623916 FOREIGN KEY (first_seen_entry_id) REFERENCES public.http_log_entries(id);
--
-- Name: domain_posts_e621_aux fk_rails_73ac068c64; Type: FK CONSTRAINT; Schema: public; Owner: -
--
@@ -5514,6 +5727,14 @@ ALTER TABLE ONLY public.domain_posts_e621_aux
ADD CONSTRAINT fk_rails_d691739802 FOREIGN KEY (caused_by_entry_id) REFERENCES public.http_log_entries(id);
--
-- Name: domain_users_bluesky_aux fk_rails_d8ceec56ec; Type: FK CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.domain_users_bluesky_aux
ADD CONSTRAINT fk_rails_d8ceec56ec FOREIGN KEY (last_posts_scan_id) REFERENCES public.http_log_entries(id);
--
-- Name: domain_post_group_joins fk_rails_eddd0a9390; Type: FK CONSTRAINT; Schema: public; Owner: -
--
@@ -5553,6 +5774,9 @@ ALTER TABLE ONLY public.domain_twitter_tweets
SET search_path TO "$user", public;
INSERT INTO "schema_migrations" (version) VALUES
('20250805071440'),
('20250805070115'),
('20250805070114'),
('20250805045947'),
('20250805044757'),
('20250731035548'),

View File

@@ -46,6 +46,7 @@ class ApplicationController
include ::FaUriHelper
include ::GoodJobHelper
include ::IpAddressHelper
include ::TelegramBotLogsHelper
include ::TimestampHelper
include ::UiHelper
include ::DeviseHelper

View File

@@ -43,6 +43,7 @@ class DeviseController
include ::FaUriHelper
include ::GoodJobHelper
include ::IpAddressHelper
include ::TelegramBotLogsHelper
include ::TimestampHelper
include ::UiHelper
include ::DeviseHelper

2732
sorbet/rbi/dsl/domain/post/bluesky_post.rbi generated Normal file

File diff suppressed because it is too large Load Diff

2763
sorbet/rbi/dsl/domain/user/bluesky_user.rbi generated Normal file

File diff suppressed because it is too large Load Diff

2225
sorbet/rbi/dsl/domain_posts_bluesky_aux.rbi generated Normal file

File diff suppressed because it is too large Load Diff

1989
sorbet/rbi/dsl/domain_users_bluesky_aux.rbi generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -46,6 +46,7 @@ class Rails::ApplicationController
include ::FaUriHelper
include ::GoodJobHelper
include ::IpAddressHelper
include ::TelegramBotLogsHelper
include ::TimestampHelper
include ::UiHelper
include ::DeviseHelper

View File

@@ -46,6 +46,7 @@ class Rails::Conductor::BaseController
include ::FaUriHelper
include ::GoodJobHelper
include ::IpAddressHelper
include ::TelegramBotLogsHelper
include ::TimestampHelper
include ::UiHelper
include ::DeviseHelper

View File

@@ -46,6 +46,7 @@ class Rails::HealthController
include ::FaUriHelper
include ::GoodJobHelper
include ::IpAddressHelper
include ::TelegramBotLogsHelper
include ::TimestampHelper
include ::UiHelper
include ::DeviseHelper

View File

@@ -407,10 +407,10 @@ class TelegramBotLog
def status_invalid_image?; end
sig { void }
def status_no_results!; end
def status_processing!; end
sig { returns(T::Boolean) }
def status_no_results?; end
def status_processing?; end
sig { void }
def status_success!; end
@@ -534,7 +534,7 @@ class TelegramBotLog
def not_status_invalid_image(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateAssociationRelation) }
def not_status_no_results(*args, &blk); end
def not_status_processing(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateAssociationRelation) }
def not_status_success(*args, &blk); end
@@ -606,6 +606,9 @@ class TelegramBotLog
end
def select(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateAssociationRelation) }
def slow_requests(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateAssociationRelation) }
def status_error(*args, &blk); end
@@ -613,7 +616,7 @@ class TelegramBotLog
def status_invalid_image(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateAssociationRelation) }
def status_no_results(*args, &blk); end
def status_processing(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateAssociationRelation) }
def status_success(*args, &blk); end
@@ -1923,7 +1926,7 @@ class TelegramBotLog
def not_status_invalid_image(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateRelation) }
def not_status_no_results(*args, &blk); end
def not_status_processing(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateRelation) }
def not_status_success(*args, &blk); end
@@ -1995,6 +1998,9 @@ class TelegramBotLog
end
def select(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateRelation) }
def slow_requests(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateRelation) }
def status_error(*args, &blk); end
@@ -2002,7 +2008,7 @@ class TelegramBotLog
def status_invalid_image(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateRelation) }
def status_no_results(*args, &blk); end
def status_processing(*args, &blk); end
sig { params(args: T.untyped, blk: T.untyped).returns(PrivateRelation) }
def status_success(*args, &blk); end