commit - 76131e8ce5643b47b84cb6905f3982c6a13985ed
commit + c95d724e6ea4834f456b1839bcb4b7d3c8cdc0f9
blob - /dev/null
blob + 88ad8b734d345544e842a52e086a9ab0e012b714 (mode 644)
--- /dev/null
+++ commands.txt
+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
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);
}
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 {