Commit Diff


commit - 76131e8ce5643b47b84cb6905f3982c6a13985ed
commit + c95d724e6ea4834f456b1839bcb4b7d3c8cdc0f9
blob - /dev/null
blob + 88ad8b734d345544e842a52e086a9ab0e012b714 (mode 644)
--- /dev/null
+++ commands.txt
@@ -0,0 +1,13 @@
+Crybot IRC Commands
+
+!axfr <domain> <nameserver>
+!banner <host> <port>
+!confession
+!help
+!ipinfo <IP|host>
+!md5 <string>
+!ns <domain>
+!resolve <IP|host>
+!sickjoke
+!sicksearch <search term>
+!ud <word|phrase>
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{<tr><td>(.+?)</}is ) {
-        my $joke = decode_entities($1);
-        $joke =~ s/<.*?>//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 {