commit c95d724e6ea4834f456b1839bcb4b7d3c8cdc0f9 from: lex0de date: Thu Aug 20 22:52:20 2026 UTC fix sickjoke; add commands.txt commit - 76131e8ce5643b47b84cb6905f3982c6a13985ed commit + c95d724e6ea4834f456b1839bcb4b7d3c8cdc0f9 blob - /dev/null blob + 88ad8b734d345544e842a52e086a9ab0e012b714 (mode 644) --- /dev/null +++ commands.txt @@ -0,0 +1,13 @@ +Crybot IRC Commands + +!axfr +!banner +!confession +!help +!ipinfo +!md5 +!ns +!resolve +!sickjoke +!sicksearch +!ud blob - 6f11c4e6e198e0072a1e5d888e73effbdce43c97 blob + 5f62b9570788b9ffc464892be3b0f1df68474cbf --- crybot.pl +++ crybot.pl @@ -9,7 +9,7 @@ use autodie qw(:socket :io); use Socket qw(AF_INET PF_INET SOCK_STREAM inet_aton inet_ntoa sockaddr_in); use IO::Select; -use IO::Socket::SSL qw(debug4); +use IO::Socket::SSL; use Digest::MD5 qw(md5_hex); use IP::Country::Fast; use Net::Whois::IP qw(whoisip_query); @@ -614,17 +614,65 @@ sub cmd_confession { } sub cmd_sickjoke { - my ( $sock, $config, $nick, $target, $args, $is_private ) = @_; - my $body = get('http://www.sickipedia.org/get.php?rand'); - return unless $body; + my ( $sock, $config, $nick, $target, $args, $is_private ) = @_; + my $endpoint = 'https://api.sickipedia.net/Post/Post_Search'; + my $request = { + DurationType => 6, + PageNumber => 1, + PageSize => 25, + PostTypeID => 1, + PostWallSearchType => 1, + TimelineType => 2, + }; + my $fetch_page = sub { + my ($page_number) = @_; - if ( $body =~ m{(.+?)//g; - my $respond_to_channel = $config->{silence} eq 'NO' && !$is_private; - my $response_target = $respond_to_channel ? $target : $nick; - irc_print( $sock, "PRIVMSG $response_target :$joke" ); - } + $request->{PageNumber} = $page_number; + my $response = http_client()->post( + $endpoint, + { + content => encode_json($request), + headers => { + 'Accept' => 'application/json', + 'Content-Type' => 'application/json', + 'SessionKey' => '', + 'X-Requested-With' => 'XMLHttpRequest', + }, + } + ); + return unless $response->{success}; + + my $data = eval { decode_json( $response->{content} ) }; + return if $@ || ref $data ne 'HASH' || $data->{HasError}; + return $data; + }; + + my $data = $fetch_page->(1); + return unless $data; + + my $page_size = $data->{PageSize} // 25; + my $total_records = $data->{TotalRecords} // 0; + return unless $page_size > 0 && $total_records > 0; + + my $record_index = int rand $total_records; + my $page_number = int( $record_index / $page_size ) + 1; + my $joke_index = $record_index % $page_size; + $data = $fetch_page->($page_number) if $page_number > 1; + return unless $data && ref $data->{Result} eq 'ARRAY' && @{ $data->{Result} }; + + $joke_index = int rand @{ $data->{Result} } + if $joke_index > $#{ $data->{Result} }; + my $joke = decode_entities( $data->{Result}->[$joke_index]->{Joke} // '' ); + $joke =~ s/<[^>]+>/ /g; + $joke =~ s/[\r\n\t]+/ /g; + $joke =~ s/\s{2,}/ /g; + $joke =~ s/^\s+|\s+$//g; + $joke =~ s/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+//g; + return unless length $joke; + + my $respond_to_channel = $config->{silence} eq 'NO' && !$is_private; + my $response_target = $respond_to_channel ? $target : $nick; + irc_print( $sock, "PRIVMSG $response_target :$joke" ); } sub cmd_ns {