summaryrefslogtreecommitdiff
path: root/lib/Boha/TrackOps.rakumod
blob: 3218cc36f9252d669f9bb792337e925e3d071dbf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/usr/bin/env rakudo 
use v6.d;
use IRC::Client;
 
class Boha::TrackOps does IRC::Client::Plugin {
    has %!is-op;
 
    multi method is-op(
        Str() $serverStr() $channelStr() $nick --> Bool
    ) {
        return %!is-op{$server}{$channel}{$nick}.so;
    }
    multi method is-op(IRC::Client::Message $e --> Bool{
        fail 'not a channel message' unless $e.?channel;
        return self.is-op($e.server,$e.channel,$e.nick);
    }
 
    method !set-user-mode(
        Str() $serverStr() $channelStr() $nickBool $mode
    ) {
        %!is-op{$server}{$channel}{$nick} = $mode;
    }
 
    # response to /NAMES 
    method irc-n353(IRC::Client::Message $e{
        my $server = $e.server;
        my ($my-nick,$equal,$channel,$names= $e.args();
 
        for $names.split(/\s+/-> $name-str {
            my $user = $name-str ~~ / ^ $<sigil> = [ '@' | '+' ]? $<nick> = [ .+ ] $ /;
 
            self!set-user-mode(
                $server, $channel,
                $user<nick>,
                $user<sigil> eq '@'
            );
        }
 
        return $.NEXT;
    }
 
    method irc-mode-channel($e{
        my ($server, $channel= $e.server, $e.channel;
        my $new-mode = (
            $e.mode eq '+o' ?? True !!
            $e.mode eq '-o' ?? False !!
            return $.NEXT
        );
 
        for $e.nicks() -> $nick {
            self!set-user-mode($server,$channel,$nick,$new-mode);
        }
 
        return $.NEXT;
    }
}