graph.pm 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. use POE;
  2. use HTML::HTML5::Parser;
  3. use HTML::Entities;
  4. use HTTP::Request::Common;
  5. use JSON;
  6. use URI::Escape;
  7. use XML::LibXML::XPathContext;
  8. my $baseurl = $BotIrc::cfg{graph_baseurl} // "http://g.jk.gs";
  9. my $dograph = sub {
  10. my ($type, $text) = @_;
  11. BotIrc::check_ctx() or return;
  12. my $req = POST("$baseurl/gen.php", [type => $type, def => $text]);
  13. $ctx = BotIrc::ctx_frozen;
  14. BotHttp::request($req, sub {
  15. my $dom = eval { HTML::HTML5::Parser->new->parse_string(shift); };
  16. if ($@) {
  17. BotIrc::send_noise($ctx, ".$type error: parsing HTML: $@");
  18. return;
  19. }
  20. my $xpc = XML::LibXML::XPathContext->new($dom);
  21. $xpc->registerNs('x', 'http://www.w3.org/1999/xhtml');
  22. my @nodes = $xpc->findnodes('//x:pre[1]');
  23. if (@nodes) {
  24. my $err = $nodes[0]->textContent;
  25. chomp $err;
  26. $err =~ s/[\r\n]+/ | /g;
  27. BotIrc::send_noise($ctx, ".$type error processing the definition: $err");
  28. return;
  29. }
  30. my $src = $xpc->findvalue('//x:img/@src');
  31. if (!defined $src) {
  32. BotIrc::send_noise($ctx, ".$type error: couldn't find generated image, sorry");
  33. return;
  34. }
  35. BotIrc::send_wisdom($ctx, ".$type: $baseurl/$src");
  36. }, sub {
  37. BotIrc::send_noise($ctx, ".$type error: graph generation failed: ".shift);
  38. return;
  39. });
  40. };
  41. {
  42. irc_commands => {
  43. graph => sub { $dograph->('graph', $_[2]); },
  44. digraph => sub { $dograph->('digraph', $_[2]); },
  45. },
  46. };