version.pm 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. use POE;
  2. use version ();
  3. {
  4. irc_commands => {
  5. version => sub {
  6. my ($source, $targets, $args, $account) = @_;
  7. BotIrc::check_ctx() or return;
  8. my $nick = BotIrc::nickonly($source);
  9. my $ctx = BotIrc::ctx_frozen;
  10. my $chan = $BotIrc::config->{version_channel};
  11. my $version;
  12. my $newest_ver_norm;
  13. my @tags = split(/[\015\012]+/, `GIT_DIR=$BotIrc::config->{git_repo} git tag -l`);
  14. foreach my $tag (@tags) {
  15. next if $tag !~ /^v(\d+(?:\.\d+)*)\s*$/;
  16. my $v = $1;
  17. my @v = split(/\./, $v);
  18. $v[2] //= 0;
  19. $v[3] //= 0;
  20. my $v_norm = join('', map { sprintf("%03d", $_) } @v);
  21. if (!defined $newest_ver_norm || $newest_ver_norm lt $v_norm) {
  22. $newest_ver_norm = $v_norm;
  23. $version = $v;
  24. }
  25. }
  26. if (!defined $version) {
  27. BotIrc::send_noise($ctx, ".version error: repository contains no tags");
  28. return;
  29. }
  30. my $topic = $BotIrc::irc->channel_topic($chan) || do {
  31. BotIrc::send_noise($ctx, ".version error: topic not cached, can't do anything. Sorry.");
  32. return;
  33. };
  34. $topic = $topic->{Value};
  35. if ($topic !~ /\b(\d+(?:\.\d+)+)\b/) {
  36. BotIrc::send_noise($ctx, ".version error: no current version found in first part of topic; can't change anything.");
  37. return;
  38. }
  39. my $old_ver = $1;
  40. if ($old_ver eq $version) {
  41. BotIrc::send_noise($ctx, ".version: still at $old_ver, not updating topic.");
  42. return;
  43. }
  44. $topic =~ s/$old_ver/$version/;
  45. $BotIrc::irc->yield(topic => $chan => $topic);
  46. },
  47. },
  48. };