Files
titlebot-ng-ng/__pycache__/room.cpython-314.pyc
T

324 lines
48 KiB
Plaintext
Raw Normal View History

2026-08-06 21:34:52 -05:00
+
2026-09-04 10:43:53 -05:00
æšjˆ“ãó®Rt^RIt^RIt^RIt^RIt^RIt^RIt^RIH t H
2026-08-06 21:34:52 -05:00
t
2026-09-04 10:21:24 -05:00
H t H t H
2026-08-06 21:34:52 -05:00
t
HtHtHt^RIHt^RIt^RIt.ROt!RR4t!RR4tR#) zè
This is an instance of connecting to a room and maintaining suggestions.
2026-09-04 10:21:24 -05:00
I've been re-writing the original functions of methods for this class, so
2026-08-06 21:34:52 -05:00
there's some elements that need to be cleaned up and only make sense in that light.
2026-09-04 10:21:24 -05:00
N)Ú AsyncClientÚ
2026-08-06 21:34:52 -05:00
LoginResponseÚMessageDirectionÚProfileGetDisplayNameResponseÚRoomMessageTextÚRoomMessagesResponseÚRoomSendResponseÚ SyncResponse)ÚPostcó4a]tRt^toRRltRRltRtVtR#)ÚConfigcó(VPV4R#©N)Ú load_config)ÚselfÚ config_paths&&Úroom.pyÚ__init__ÚConfig.__init__sØ ×јÖcóþ\VR4;_uu_4p\P!V4pVPRR4VnVPRR4VnVPRR4VnVPRR4VnVPRR4VnVPR ^d4Vn VPR
2026-09-04 10:21:24 -05:00
R 4Vn
VPR R
4Vn VPRR4Vn VPR^H4Vn
VPRR4VnVPRR4VnVPR^4VnVPRR4VnVPRR4VnVPRR4VnVPR^4VnVPRR4VnVPR^<4VnRRR4R# +'giR#;i) ÚusernameÚmagbotÚpasswordÚÚroom_idÚlookback_limitÚdbNamezsuggestions.dbÚ
batch_sizeÚuser_lookback_limitiˆÚ
homeserverzhttps://matrix.orgÚ vote_hostÚ localhostÚvote_activity_hoursÚ vote_pathÚ sync_timeouti¸ Ú
poll_intervalÚcommand_sync_timeouti0uÚ
2026-09-04 10:43:53 -05:00
post_intervalgà?Úinitial_sync_timeouti,Úpost_loop_intervalÚuser_list_intervalÚuser_list_retry_intervalNi )ÚopenÚyamlÚ safe_loadÚgetrrrrÚdb_namerr r!r"r$r%r&r'r(r)r*r+r,r-)rÚpathÚfileÚconfigs&& rrÚConfig.load_configs•Ü
2026-09-04 10:21:24 -05:00
$˜_Œ_ Ü—^^ )ˆ"ŸJ™J z°8Ó<ˆDŒMØ"ŸJ™J z°2Ó6ˆDŒMØ!Ÿ:™: Ó4ˆDŒLØ"(§*¡*Ð-=¸xÓ"Hˆ Ø!Ÿ:™: hÐ0@ÓAˆDŒLØ$Ÿj™j¨°sÓ;ˆDŒOØ'-§z¡zÐ2GÈÓ'Nˆ $Ÿj™j¨Ð7KÓLˆDŒOØ#ŸZ™Z¨ °[ÓAˆDŒNØ'-§z¡zÐ2GÈÓ'Lˆ #ŸZ™Z¨ °RÓ8ˆDŒNØ &§
2026-09-04 10:43:53 -05:00
¡
2026-09-04 10:21:24 -05:00
¨>¸4Ó @ˆ Ø!'§¡¨O¸RÓ!@ˆ Ø(.¯
©
Ð3IÈ5Ó(Qˆ %Ø!'§¡¨O¸SÓ!Aˆ Ø(.¯
2026-08-06 21:34:52 -05:00
©
Ð3IÈ3Ó(Oˆ %Ø&,§j¡jÐ1EÀqÓ&Iˆ #Ø&,§j¡jÐ1EÀsÓ&Kˆ #Ø,2¯J©JÐ7QÐSUÓ,Vˆ )÷)__Š_ús •G G+Ç+ G< )rr(r2r!r*rrr'r)r+rr&r,r-r rr$r"r%N)úconfigs/config.yaml)Ú__name__Ú
__module__Ú __qualname__Ú__firstlineno__rrÚ__static_attributes__Ú__classdictcell__©Ú
__classdict__s@rr r sø‡ôWòWrr có6a]tRt^/toR)RltRtRtRtRtRt Rt
R t R
t R t
]R 4tR
tRtRtR*RltRtRtRtRtR*RltR*RltR*RltR*RltRtR*RltR+RltRtRt R,Rlt!Rt"R t#R!t$R"t%R*R#lt&R$t'R%t(R&t)R't*R(t+Vt,R#)-ÚRoomNcó¼\V4VnT;'g\VnRVn.Vn.Vn.VnRVnRVn RVn
RVn RVn ^Vn
/VnV'dW0PnVP!VPP"4VnRVnVP)4VP+4R#)rNzbanned_users.db)r r5Údefault_search_termsÚ search_termsÚformatted_sugsÚpostsÚnewly_inserted_postsÚrejected_banned_postsÚclientÚroomÚuser_idÚmemberÚ display_nameÚlast_runÚ_display_name_cacher!Ú safe_db_namerÚdb_pathÚbanned_db_pathÚinit_dbÚinit_banned_db)rrrDr!s&&&&rrÚ
Room.__init__0ܘŒ Ø@Ô,@ˆÔØ ˆÔ؈Œ
Ø$&ˆÔ!Ø%'ˆÔˆŒ ؈Œ ؈Œ ؈Œ Ø ˆÔ؈Œ
Ø#%ˆÔ ç Ø%/K‰KÔ ×¯©×)<Ñ)<ÓŒ ØÔØ ŒØ ×ÑÖrcó>\P!RRV4pRV R2#)z[^a-zA-Z0-9_-]Ú suggestions_z.db)ÚreÚsub)rrÚsafes&& rrPÚRoom.safe_db_nameHs$ÜvŠvШgÓ6ˆØ˜d˜V 'rcóT\P!VP4pVP4pVP R4pVP R4pVP 4Uu.uF qD^,NK
ppRV9dVP R4pRV9dVP R4pVP R4pVP R4pVP R4pVP R 4pVP R
4p\P !V4VP4R #uupi) a
CREATE TABLE IF NOT EXISTS suggestions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user TEXT,
display_name TEXT,
message TEXT,
timestamp INTEGER,
age INTEGER,
is_posted INTEGER DEFAULT 0,
event_id TEXT,
UNIQUE(user, message, timestamp)
)
zPRAGMA table_info(suggestions)Ú is_postedz>ALTER TABLE suggestions ADD COLUMN is_posted INTEGER DEFAULT 0Úevent_idz0ALTER TABLE suggestions ADD COLUMN event_id TEXTzSCREATE UNIQUE INDEX IF NOT EXISTS idx_suggestions_event_id ON suggestions(event_id)aJ
CREATE TABLE IF NOT EXISTS gettitles (
id INTEGER PRIMARY KEY AUTOINCREMENT,
event_id TEXT,
sender TEXT,
timestamp INTEGER,
datetime TEXT,
UNIQUE(event_id),
UNIQUE(sender, timestamp)
)
aG
CREATE TABLE IF NOT EXISTS mayhem (
id INTEGER PRIMARY KEY AUTOINCREMENT,
event_id TEXT,
sender TEXT,
timestamp INTEGER,
datetime TEXT,
UNIQUE(event_id),
UNIQUE(sender, timestamp)
)
aK
CREATE TABLE IF NOT EXISTS countvotes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
event_id TEXT,
sender TEXT,
2026-09-04 10:21:24 -05:00
timestamp INTEGER,
datetime TEXT,
UNIQUE(event_id),
UNIQUE(sender, timestamp)
)
aH
CREATE TABLE IF NOT EXISTS voteurl (
id INTEGER PRIMARY KEY AUTOINCREMENT,
event_id TEXT,
2026-08-06 21:34:52 -05:00
sender TEXT,
2026-09-04 10:21:24 -05:00
timestamp INTEGER,
datetime TEXT,
UNIQUE(event_id),
UNIQUE(sender, timestamp)
)
N)ÚdbutilÚconnectrQÚcursorÚexecuteÚfetchallÚcommitÚclose©rÚconnÚcrWÚrowÚcolss& rrSÚ Room.init_dbLsÜ~Š~˜dŸl™lÓØ K‰K‹MˆØ
2026-09-04 10:43:53 -05:00
I‰Ið  ó
2026-09-04 10:21:24 -05:00
ˆð
I‰IÐ 7ˆØ"#§*¡*¤,Ó/¡,˜3A—¡,ˆÐ ˜dÔ — ‘ Ð[ˆ ˜TÔ — ‘ ÐMˆAà
I‰IÐ lˆð
2026-09-04 10:43:53 -05:00
I‰Ið
2026-09-04 10:21:24 -05:00
 ó
2026-09-04 10:43:53 -05:00
2026-09-04 10:21:24 -05:00
ˆð
I‰Ið
 ó
2026-08-06 21:34:52 -05:00
ˆð
2026-09-04 10:21:24 -05:00
I‰Ið
 ó
2026-09-04 10:43:53 -05:00
2026-09-04 10:21:24 -05:00
ˆð
2026-08-06 21:34:52 -05:00
I‰Ið
2026-09-04 10:43:53 -05:00
 ó
2026-09-04 10:21:24 -05:00
2026-08-06 21:34:52 -05:00
2026-09-04 10:21:24 -05:00
ˆô 
Š
Ø
Ž ùòy0sÁ%D%c óÔ\P!VP4pVP4pVP R4p\P
!V4VP
2026-09-04 10:43:53 -05:00
4R#)zHInitialize the shared banned-users database (primary key + user string).z¤
CREATE TABLE IF NOT EXISTS banned_users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user TEXT UNIQUE
2026-09-04 10:21:24 -05:00
)
2026-08-06 21:34:52 -05:00
r`rarRrbrcrerf©rrhrirWs& rrTÚRoom.init_banned_dbœsKä~Š~˜Ø K‰K‹MˆØ
I‰Ið ó
2026-09-04 10:21:24 -05:00
ˆô 
2026-08-06 21:34:52 -05:00
Š
2026-09-04 10:43:53 -05:00
Ø
2026-09-04 10:21:24 -05:00
2026-09-04 10:43:53 -05:00
Ž rc óäV'gR#\P!VP4pVP4pVP RV34pVP 4pVP
2026-08-06 21:34:52 -05:00
4VRJ#)zDReturn True if the given Matrix account/homeserver string is banned.Fz)SELECT 1 FROM banned_users WHERE user = ?N)r`rarRrbrcÚfetchonerf)rÚuserrhrirWrjs&& rÚ is_bannedÚRoom.is_banned©sXçÙÜ~Š~˜dר K‰K‹MˆØ
2026-09-04 10:21:24 -05:00
I‰IÐAÀDÀ7Ó Øj‰j‹lˆØ
2026-09-04 10:43:53 -05:00
2026-08-06 21:34:52 -05:00
Œ ؘ$ˆÐrc óØ\P!VP4pVP4pVP RV34p\P
2026-09-04 10:21:24 -05:00
!V4VP
2026-08-06 21:34:52 -05:00
4R#)z:Add a Matrix account/homeserver string to the banned list.z4INSERT OR IGNORE INTO banned_users (user) VALUES (?)Nrn©rrsrhrirWs&& rÚban_userÚ
Room.ban_user´sIä~Š~˜Ø K‰K‹MˆØ
I‰IÐLÈtÈgÓ Ü
Š
Ø
2026-09-04 10:43:53 -05:00
Ž rc óØ\P!VP4pVP4pVP RV34p\P
2026-08-06 21:34:52 -05:00
!V4VP
2026-09-04 10:43:53 -05:00
4R#)z?Remove a Matrix account/homeserver string from the banned list.z'DELETE FROM banned_users WHERE user = ?Nrnrws&& rÚ
unban_userÚRoom.unban_user¼sIä~Š~˜Ø K‰K‹MˆØ
2026-08-06 21:34:52 -05:00
I‰IÐ?À$ÀÓ Ü
2026-09-04 10:43:53 -05:00
Š
2026-08-06 21:34:52 -05:00
Ø
2026-09-04 10:43:53 -05:00
Ž rcƒ ó^"VPVP R24GRjxL
2026-08-06 21:34:52 -05:00
R#L5i)z9Reply to a banned user's suggestion and do not insert it.z2: this user has been banned from submitting titlesN)Ú
2026-09-04 10:43:53 -05:00
alert_postrM©rÚposts&&rÚreject_banned_suggestionÚRoom.reject_banned_suggestionÄs&éào‰o ×!2Ñ!2Ð 3Ð3eÐg×gùs "-¤+¥-cƒó0"VPf:\VPPVPP4Vn\ VPRR4'd)\
2026-08-06 21:34:52 -05:00
R4VPPVnR#VPPVPP4GRjxL
p\V\4'd)\
2026-09-04 10:43:53 -05:00
R4VPPVnR#\
2026-08-06 21:34:52 -05:00
RV 24R#LR5i) access_tokenzReusing existing login.Tz
2026-09-04 10:43:53 -05:00
Logged in!zFailed to log in: F) rIrr5r!rÚgetattrÚprintrKÚloginrÚ
2026-08-06 21:34:52 -05:00
isinstancer)rÚresps& rÚlogin_to_matrixÚRoom.login_to_matrixÈéà ;‰;Ò Ü% d§k¡k×&<Ñ&<¸d¿k¹k×>RÑ>RÓSˆDŒKä 4—;; °× Ð Ÿ;™;×.ˆDŒLÙà—[[×& t§{¡{×';Ñ';Ó<×<ˆÜ dœM×  ØŸ;™;×.ˆDŒLÙä Ð& t  ñ=ùsB?DÃDÃADcƒóz"WP9dVPV,#VPfQhTpVPPPVPP
4pV'dTWP 9dDVP V,p\VR4'dVP'd
2026-09-04 10:43:53 -05:00
VPpW!8XdXVPPV4GRjxL
2026-08-06 21:34:52 -05:00
p\V\4'dVP'd
VPpW PV&V#LH5i)NrM)
2026-09-04 10:43:53 -05:00
rOrIÚroomsr1r5rÚusersÚhasattrrMÚget_displaynamerˆrÚ displayname)rrKÚnamerJrLr‰s&& rÚget_display_nameÚRoom.get_display_nameÛéØ × ×+¨GÕ {‰{ÒˆØ{‰{× Ñ ×$ T§[¡[×%8Ñ%8Ó9ˆß GŸz™zÔ—Z‘Z Õ(ˆv˜~×.°6×3F×3FÐ3FØ×*Ø Œ?ØŸ×4°WÓ=ˆ˜$Ô =×>À4×CS×CSÐCSØ×'Ø,0× Ñ  Ñˆ ñ >ùs%A6D;Á9AD;Ã0D;Ã0D9Ã1+D;ÄD;có‚\P!RR\V4P44P R4pV#)z
2026-09-04 10:21:24 -05:00
[^a-z0-9]+Ú-)rYrZÚstrÚlowerÚstrip)Útexts&rÚslugifyÚ Room.slugifyìs/ävŠvm S¬#¨d«)¯/©/Ó*;Ó<×BÀ3ÓGˆØˆ rc óüVPP'dVPP#RpVP'ddVPPP VPP
4pV'd#\
VRR4;'g\
VRR4pV'gVPP
pVPV4VPnVPP#)zTResolve a URL-safe slug for this room (config override, then room name, then alias).NrÚcanonical_alias)r5r%rIrr1rr…r)rÚslugrJs& rÚ
get_room_slugÚRoom.get_room_slugñà ;‰;× × Ð Ø—;‘;× ˆØ ;;ˆ;Ø—;‘;×$ׯ©×)<Ñ)<Ó=ˆÜ˜t V¨TÓ2×\´g¸dÐDUÐW[Ó6\ߨ—;;×&ˆDØ $§ ¡ ¨TÓ 2ˆ ÔØ{‰{×$rc  óü^RIp^RIpVP4pRp/pVPP V4'd0\ VR4;_uu_4pVP
V4pRRR4W5VPP&\ VR4;_uu_4pVPWV^RR7RRR4R# +'giL[;i TP\3d/pLyi;i +'giR#;i)zFPersist the resolved slug so the Go voting services can route by path.Nzroom_slugs.jsonrÚwT)ÚindentÚ sort_keys) ÚjsonÚosr r3Úexistsr.ÚloadÚJSONDecodeErrorÚOSErrorr5rÚdump)rr3ÚdataÚfs& rÚwrite_room_slugsÚRoom.write_room_slugsÿãÛØ×Ø ˆØˆØ
7‰7>‰>˜$× Ò ð
2026-08-06 21:34:52 -05:00
ܘ$ —_”_¨ØŸ9™9 Q<%)ˆT[‰[×
2026-09-04 10:21:24 -05:00
Ñ
Ñ
$˜_Œ_ Ø I‰Id a°4ˆ ‰_÷ %—_ûà×(¬'Ð
2026-09-04 10:43:53 -05:00
Øð
ú÷_ˆ_ús;¿C ÁB8Á%C ÂC*Â8 C ÃC ÃC Ã C'Ã&C'Ã* C; c óVRVPP RVP4 2#)z(Build the full voting URL for this room.zhttp://z:9081/)r5r"r ©rs&rÚvote_urlÚ
Room.vote_urls*à˜Ÿ×/¨v°d×6HÑ6HÓ6JÐ5KÐLrcƒó,"VfVPPp.VnVPPpRp^pVP 4VP
fQhWA8Ed)\
2026-08-06 21:34:52 -05:00
W!V,
4pVP
2026-09-04 10:21:24 -05:00
PVPPVV\PR7GRjxL
2026-08-06 21:34:52 -05:00
p\V\4'dVP'gR#VPEFJpVP'd"\VR^4VP8dRpR#\V\ 4'gKOVP"pVP$p VP'V 4'gKV\)V 4RP+4p
VP-VP.4GRjxL
2026-09-04 10:21:24 -05:00
p \1VP2R,4p \1\4P6!44V ,
p
\9VP.V V
V V
\VRR4R7pVPP;V4EKH EKM V\)VP4,
p\=RV R2RR R
7\VR R4pV'dEK-R#R#ELÞ5i) ÚstartÚlimitÚ directionÚserver_timestampéèr_)ÚposterrMÚcontentÚtimeÚager_zLooked back on z messages...Ú
T)ÚendÚflushrÁ)r5rrFrÚ get_last_runrIÚminÚ
room_messagesrrÚbackrˆrÚchunkrNr…rÚbodyrDÚ
startswithÚlenÚlstripr“ÚsenderÚintrºÚ_timer¾r
Úappendr†)rr¸rÚ
next_batchÚfetchedÚ fetch_amountÚresponseÚeventÚmsgÚtermÚ clean_msgrMÚevent_ts_secondsÚ age_secondsr€s&& rÚ
2026-09-04 10:43:53 -05:00
get_convosÚRoom.get_convosséØ Š=Ø—K‘K×.ˆEàˆŒ
2026-09-04 10:21:24 -05:00
Ø—[[×+ˆ
2026-08-06 21:34:52 -05:00
؈
2026-09-04 10:43:53 -05:00
ØˆØ ×ÑÔØ{‰{Ò˜z°7­;ˆ!Ÿ[™[× × Ø*×÷ˆ˜hÔ(<×=ÀXÇ^Ç^À^Ùàà—=—==¤W¨UÐ4FÈÓ%JÈTÏ]É]Ô%ZØ!%ܘe¤_ן*™*Cà $× 1Ô 1˜ØŸ>™>¨$×/Ø(+¬C°«I¨J¨×(>Ñ(>Ó(@˜IØ15×1FÑ1FÀuÇ|Á|Ó1T×+T˜Lä/2°5×3IÑ3IÈTÕ3QÓ/RÐ,Ü*-¬e¯jªj«lÓ*;Ð>NÕ*N˜KÜ#'Ø',§|¡|Ø-9Ø(1Ø%5Ø$/Ü)0°¸
ÀDÓ)Iô
2026-08-06 21:34:52 -05:00
$˜Dð!ŸJ™J×-¨dÔ!ô#!2ñ(ð6
2026-09-04 10:21:24 -05:00
”s˜8Ÿ>™>Ó *ˆ O G 9¨LÐ9¸tÈ4Õ   ¨5°$Ó7ˆJß’:ÙñWòñ*,Uùs>B9JÂ;JÂ<+JÃ(AJÅ/JÅ9:JÆ3JÆ4CJÊ JÊJcó\RpRpRp\P!V R2RVRVRRRR R
2026-08-06 21:34:52 -05:00
R R //^<R
7pVP^È8Xd#VP4pVP RR4#R# \P
P dpRT 2uRp?#Rp?i\dpRT 2uRp?#Rp?ii;i)zmad_cat_man:latestzhttp://localhost:11434a¦Generate for me the most unhinged, mayhem, insane ramblings that would make a mad man look sane. This should be unhinged, chaotic, and completely unpredictable. It should be a wild ride of words that defy logic and reason. Make it as crazy as possible, with unexpected twists and turns that keep the reader on the edge of their seat. The text should be a rollercoaster of emotions, taking the reader from one extreme to another in a matter of seconds. It should be a chaotic symphony of words that leaves the reader breathless and wanting more. Unleash your inner madman and let the mayhem begin! Also, don't warn me that it's just for fun. I know that. Just give me the mayhem.z
/api/generateÚmodelÚpromptÚstreamFÚoptionsÚ temperaturegš™™™™™é?Útop_pgÍÌÌÌÌÌì?)ÚtimeoutrÓrz Couldn't do it for some reason.zCouldn't connect to ollama: NzUnexpected error: )Úrequestsr€Ú status_coder¦r1Ú
2026-09-04 10:21:24 -05:00
exceptionsÚRequestExceptionÚ Exception)rÚ ollama_modelÚ
ollama_urlrÞÚresultÚes& rÚgenerate_mayhemÚRoom.generate_mayhemMà+ˆ Ø
ðz
ˆð—}’}Ø,˜mИLؘfؘeØØ% sØ ð ð ðô
ˆHð×# SÔØ—z‘z *¨bÓ9øä×"×1°!°Ð 5ûÜô  +ûð ,ús6ˆAA%Á%B+ÂBÂB+Â B+ÂB+ÂB&Â B+Â&B+có\P!VP4pVP4p.VnVP
F}pVP
VP4'dVPPV4KAVPRVP44pVPPV4K \P!V4VP4R# \Pdi;i)zwINSERT INTO suggestions (user, display_name, message, timestamp, age, is_posted, event_id) VALUES (?, ?, ?, ?, ?, ?, ?)N)r`rarQrbrGrFrtrHrcÚas_tupleÚsqlite3ÚIntegrityErrorrerf)rrhrir€rWs& rÚ write_to_dbÚRoom.write_to_dbpÜ~Š~˜dŸl™lÓ+ˆØ K‰K‹Mˆà$&ˆÔ—J”Jˆ~‰~˜dŸk™k××1°$Ôð
Ø—I‘IðNØ—M‘M“Oóð×Öô 
Š
Ø
Ž øô ×
Úð
úsÂ;C-Ã-DÄDcóTVPPp\P!R4pVP 4pVP R4pVP R4pVP
4Uu.uF qU^,NK
ppRV9dVP R4p\\P!44p\PP4PRRR7pVP RWV34p\P!V4VP4R #uupi)
ú last_run.dbú´
CREATE TABLE IF NOT EXISTS last_run (
room_id TEXT PRIMARY KEY,
2026-09-04 10:43:53 -05:00
timestamp INTEGER,
2026-09-04 10:21:24 -05:00
datetime TEXT
2026-08-06 21:34:52 -05:00
)
2026-09-04 10:43:53 -05:00
úPRAGMA table_info(last_run)Údatetimeú-ALTER TABLE last_run ADD COLUMN datetime TEXTÚ Úseconds©ÚsepÚtimespeczOINSERT OR REPLACE INTO last_run (room_id, timestamp, datetime) VALUES (?, ?, ?)N)r5rr`rarbrcrdÚnowÚ isoformatrerf) rrrhrirWrjrkrÚnow_strs & rÚupdate_last_runÚRoom.update_last_run…Ø—+‘+×Ü~Š~˜mÓØ K‰K‹MˆØ
2026-08-06 21:34:52 -05:00
I‰Ið ó
ˆð
I‰IÐ 4ˆØ"#§*¡*¤,Ó/¡,˜3A—¡,ˆÐ ˜TÔ — ‘ ÐJˆAä”%—*’*“,ÓˆÜ×#×)×3¸ÀiÐØ
2026-09-04 10:21:24 -05:00
I‰IÐgÐjqÐxðjAó
2026-09-04 10:43:53 -05:00
BˆÜ
Š
2026-09-04 10:21:24 -05:00
Ø
2026-09-04 10:43:53 -05:00
2026-09-04 10:21:24 -05:00
Ž ùò0sÁ1D%cóêVPPp\P!R4pVP 4pVP R4pVP R4pVP
4Uu.uF qU^,NK
ppRV9dVP R4pVP RV34pVP4pVP4V'dV^,Vn R#^Vn R#uupi)z0SELECT timestamp FROM last_run WHERE room_id = ?N)
2026-08-06 21:34:52 -05:00
r5rr`rarbrcrdrrrfrN)rrrhrirWrjrks& rÚRoom.get_last_runØ—+‘+×Ü~Š~˜mÓØ K‰K‹MˆØ
I‰Ið ó
2026-09-04 10:21:24 -05:00
ˆð
I‰IÐ 4ˆØ"#§*¡*¤,Ó/¡,˜3A—¡,ˆÐ ˜TÔ — ‘ ÐJˆAØ
2026-08-06 21:34:52 -05:00
I‰IÐHÈ7È*Ó Øj‰j‹lˆØ
Œ ß Ø FˆDŽMàˆDŽMùò0sÁ1C0có~\P!VP4pVP4p\PP \
V44PRRR7pVPRW1\
V4V34pVP^8Hp\P!V4VP4V#)z}
2026-09-04 10:43:53 -05:00
INSERT OR IGNORE INTO gettitles (event_id, sender, timestamp, datetime)
2026-08-06 21:34:52 -05:00
VALUES (?, ?, ?, ?)
2026-09-04 10:21:24 -05:00
© r`rarQrbÚ
2026-09-04 10:43:53 -05:00
fromtimestamprÍrrcÚrowcountrerf© rÚ timestampr_rhriÚdt_strrWÚinserteds &&&& rÚrecord_gettitlesÚRoom.record_gettitles´sÜ~Š~˜dŸl™lÓØ K‰KMˆÜ×"×0´°Y³Ó@×JÈsÐ]fÐØ
2026-08-06 21:34:52 -05:00
I‰Ið ð¤ I£°Ð
2026-09-04 10:21:24 -05:00

ð—:‘: ‘?ˆÜ
Š
2026-08-06 21:34:52 -05:00
Ø
2026-09-04 10:21:24 -05:00
2026-09-04 10:43:53 -05:00
Œ ؈rc ó~\P!VP4pVP4p\PP \
2026-08-06 21:34:52 -05:00
V44PRRR7pVPRW1\
V4V34pVP^8Hp\P!V4VP4V#)zJRecord a !mayhem detection; returns True if newly recorded (not duplicate)rûzz
INSERT OR IGNORE INTO mayhem (event_id, sender, timestamp, datetime)
VALUES (?, ?, ?, ?)
rr s &&&& rÚ
2026-09-04 10:21:24 -05:00
record_mayhemÚRoom.record_mayhemÂó–ä~Š~˜dŸl™lÓØ K‰KMˆÜ×"×0´°Y³Ó@×JÈsÐ]fÐØ
2026-09-04 10:43:53 -05:00
I‰Ið ð¤ I£°Ð
2026-09-04 10:21:24 -05:00

2026-09-04 10:43:53 -05:00
ð—:‘: ‘?ˆÜ
2026-08-06 21:34:52 -05:00
Š
2026-09-04 10:21:24 -05:00
Ø
2026-08-06 21:34:52 -05:00
2026-09-04 10:43:53 -05:00
Œ ؈rc ó~\P!VP4pVP4p\PP \
2026-09-04 10:21:24 -05:00
V44PRRR7pVPRW1\
2026-09-04 10:43:53 -05:00
V4V34pVP^8Hp\P!V4VP4V#)zNRecord a !countvotes detection; returns True if newly recorded (not duplicate)rûz~
2026-08-12 17:14:01 -05:00
INSERT OR IGNORE INTO countvotes (event_id, sender, timestamp, datetime)
2026-08-06 21:34:52 -05:00
VALUES (?, ?, ?, ?)
rr s &&&& rÚrecord_countvotesÚRoom.record_countvotesÑrrc ó~\P!VP4pVP4p\PP \
V44PRRR7pVPRW1\
V4V34pVP^8Hp\P!V4VP4V#)zKRecord a !voteurl detection; returns True if newly recorded (not duplicate)rûz{
INSERT OR IGNORE INTO voteurl (event_id, sender, timestamp, datetime)
2026-08-12 17:14:01 -05:00
VALUES (?, ?, ?, ?)
rr s &&&& rÚrecord_voteurlÚRoom.record_voteurlàrrc
ƒ óâ"VPPpRp/p.pVPfQh\^4pVPP VPP
VV\ PR7GRjxL
p\V\4'dVP'gM6VPVP4\VRR4pV'dM VEFp\V\4'gKVPpVPR4'gKARV9gKJVP VP"8XgKgVP%R^4p \'V 4^d}V ^,P)RR4P+4p
RP-V R,4P+4p \VRR4p V 'dR V RV R
^R \/4/W:&EKEKEK V'gR
#VEF;p\5VR 4'gK\VP6\84'gK:VP6P;R/4pVP;R4R8XgKnVP;R4R8XgK†VP;R4p\VRR4pVP=4wp
pVR,V8XgKV'gK VVR ,9gK0VVP"8wgKCVR ,P?V4VR
;;,^,
uu&\3RV RV
24EK9 EK> \@;QJd*RVPC44F 'gK RM RM!RVPC444'gR#R.p\EVP=4RRR7pVFvwp
2026-08-06 21:34:52 -05:00
pVR
2026-09-04 10:43:53 -05:00
,^8XdRMR
pVPGRV
RVR
, RV 24VR ,p \'V 4^P8”dV R ,R!,p VPGR"V 24Kx R#P-V4#E\0dp
\3R T
24Rp
2026-09-04 10:21:24 -05:00
?
2026-08-06 21:34:52 -05:00
EKRp
2026-09-04 10:43:53 -05:00
?
ii;i5i)$z?Count upvotes for each suggestion and return formatted results.Nr¶ú Suggestion Ú:rNNr_ÚvotesÚvoterszError parsing suggestion: z-No suggestion posts found to count votes for.ú m.relates_toÚrel_typeú m.annotationÚkeyõðŸ‘zFound vote from z for suggestion c3ó8"TFqR,^8„xK R#5i)r)Ú.0r­s& rÚ <genexpr>Ú#Room.count_votes.<locals>.<genexpr>;séÐKÑ1J¨˜•= 1Ö$Ó1JùsTFz#No votes found for any suggestions.zVote Count Results:có"V^,R,#)rrr')Úxs&rÚ<lambda>Ú"Room.count_votes.<locals>.<lambda>@s °°!µ°W¶
r)r$ÚreverseÚvoteú: rû:NéM...u └─ Ú
2026-09-04 10:21:24 -05:00
)$r5rrIÚrangerÅrrrˆrÚextendr…rrKÚsplitrÊÚreplacer™ÚjoinÚsetrèr†rÚdictr1ÚitemsÚaddÚanyÚvaluesÚsortedrÏ)rrÚsuggestion_votesÚ
2026-09-04 10:43:53 -05:00
all_eventsrWÚpartsÚsuggestion_numr½r_Ú
relates_toÚtarget_event_idrÌr­ÚlinesÚsorted_suggestionsÚ vote_texts& rÚ count_votesÚRoom.count_votesîéð—[‘[×
؈
2026-09-04 10:21:24 -05:00
ØÐ؈
Ø{‰{Òrˆ!Ÿ[™[× × Ø Ü÷ˆ˜hÔ(<×=ÀXÇ^Ç^À^Ùà × Ñ ˜hŸn™nÔ   ¨5°$Ó7ˆJß‘:Ùñô" ˆEܘ%¤×—z‘zà—O‘O M×2°s¸d¶{Ø—LL D§L¡LÖ!à $§
2026-08-06 21:34:52 -05:00
¡
¨3°Ó 2˜Ü˜u›:¨œ?Ø-2°1­X×-=Ñ-=¸mÈRÓ-P×-VÑ-VÓ-X˜NØ&)§h¡h¨u°R­yÓ&9×&?Ñ&?Ó&A˜GÜ'.¨u°jÀ$Ó'G˜'à$-¨wØ$.°Ø$+¨QØ$,¬c«eð D"Ð 0Ô @ò  ÷2 Ù ˆEäu˜i×(¬Z¸¿
2026-09-04 10:43:53 -05:00
¹
Ät×-LÔ-LØ"Ÿ]™]×.¨~¸B
Ø—N‘N :Ó.°.Ö—NN )¨VÖ3à&0§n¡n°ZÓ&@$ U¨H°dÓ;1A×0FÑ0FÖ0HÑ,˜¨Ø  ÕÖ"™F v°T¸(µ^Ö'CØ" d§l¡lÖ  N×.¨vÔ  ŸM¨QÕ.!Ð$4°V°HÐ<LÈ^ÐL\Ð"]Ô1Iñ ÷*KÐ1A×1HÑ1HÔ1JÓKssŠsÑKÐ1A×1HÑ1HÔ1JÓK×(ˆÜ#Ð$4×$:Ñ$:Ó$<Ù&=Ø*.ôó%7Ñ ˆN˜DØ"& w¥-°1Ô"4™¸'ˆ L‰L˜; ~Ð&6°b¸¸¸ÀqÈÈ Ð ˜9•oˆGÜ7‹|˜bÔ Ø! #Õ.Ø L‰L˜9 W  %7ðy‰y˜ÓÐògøôJÐ :¸1¸#Ð ûð!üs¥A?Q/ÂQÂ+Q/Â./Q/Ã"Q/Ä Q/Ä)Q/Ä2Q/ÅBQÇ(Q/Ç;Q/ÈQ/È9/Q/É-Q/Ê?Q/Ë Q/Ë Q/Ë#Q/Ë6AQ/Í
Q/Í,(Q/ÎB0Q/Ñ Q,ÑQ'Ñ Q/Ñ'Q,Ñ,Q/cƒ ó"Vf&\\P!4R,4pVPfQhVPP VP