control.pm 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package BotCtl;
  2. use common::sense;
  3. use POE;
  4. our %ctl_sessions;
  5. sub init {
  6. BotPlugin::add_core_ctl_command('auth', sub {
  7. my ($client, $data, @args) = @_;
  8. if (@args != 1) {
  9. $client->put("error:syntax:This command needs exactly one argument.");
  10. return 1;
  11. }
  12. if (@args == 1 && $args[0] eq $BotIrc::config->{control_pwd}) {
  13. $client->put("ok");
  14. $data->{level} = '!control';
  15. }
  16. # TODO (perhaps): user auth
  17. });
  18. }
  19. sub on_connected {
  20. my $id = $_[HEAP]{client}->ID;
  21. $ctl_sessions{$id} = {
  22. client => $_[HEAP]{client},
  23. level => '!guest',
  24. };
  25. }
  26. sub on_disconnected {
  27. my $id = $_[HEAP]{client}->ID;
  28. delete $ctl_sessions{$id};
  29. }
  30. sub on_input {
  31. my ($heap, $input) = @_[HEAP, ARG0];
  32. my $client = $heap->{client};
  33. my $data = client_data($client);
  34. my ($cmd, @args) = split(/:/, $input);
  35. for (@args) {
  36. s/%([0-9a-f]{2})/chr(hex($1))/eig;
  37. }
  38. $cmd = lc $cmd;
  39. if (!BotPlugin::maybe_ctl_command($client, $data, $cmd, @args)) {
  40. $client->put("error:invalid_command:The given command is not handled by any plugin.");
  41. }
  42. }
  43. sub send {
  44. my $client = shift;
  45. my @args = @_;
  46. for (@args) { s/%/%25/g; s/:/%3A/g; s/\015/%0D/g; s/\012/%0A/g; }
  47. $client->put(join(':', @args));
  48. }
  49. sub client_data {
  50. return $ctl_sessions{shift->ID};
  51. }
  52. sub is_guest { return $_[1]->{level} eq '!guest'; }
  53. sub is_control { return $_[1]->{level} eq '!control'; }
  54. sub get_user {
  55. my $u = $_[1]->{level};
  56. return undef if ($u =~ /^!/);
  57. $u;
  58. }
  59. sub set_level {
  60. $_[0]->{level} = $_[1];
  61. }
  62. sub require_control {
  63. return 1 if &is_control;
  64. $_[0]->put("error:needpriv:Insufficient privileges.");
  65. return 0;
  66. }
  67. sub require_user {
  68. return 1 if &is_control || &get_user;
  69. $_[0]->put("error:needpriv:Insufficient privileges.");
  70. return 0;
  71. }
  72. 1;