source: trunk/base/portmgr/bots/port.rb @ 21683

Last change on this file since 21683 was 21683, checked in by jberry@…, 13 years ago

Add support for port search to mpbot. Disabled for now because it very easilly floods, which causes rbot to begin sucking cpu indefinately

File size: 4.4 KB
Line 
1#
2#       port.rb
3#
4#       Plugin to rbot (http://linuxbrit.co.uk/rbot/), an irc bot, to provide
5#       services related to MacPorts for the #macports channel on freenode.net.
6#
7#       By James D. Berry
8#
9#       $Id$
10#
11
12
13module Shuffle
14
15        def shuffle!
16                size.downto(2) do |i|
17                r = rand(i)
18                tmp = self[i-1]
19                self[i-1] = self[r]
20                self[r] = tmp
21          end
22          self
23        end
24       
25        def shuffle
26                Array.new(self).extend(Shuffle).shuffle!
27        end
28       
29end
30
31
32
33class PortPlugin < Plugin
34
35        def help(plugin, topic="")
36                case topic
37                  when "info"
38                        return "info <portname> => show info for port <portname>"
39                  when "maintainer"
40                        return "maintainer <portname> => show maintainer of port <portname>"
41                  when "version"
42                        return "version <portname> => show version of port <portname>"
43                  when "search"
44                        return "search <query> => show ports matching <query>"
45                  when "herald"
46                        return "herald enable|disable => enable or disable heralding by port"
47                  when "remember"
48                        return "remember <nick> email <address> => remember what port maintainer email <nick> belongs to"
49                  when "forget"
50                        return "forget <nick> => forget email correspondance for <nick>"
51                  else
52                        return "port (MacPorts) commands: info, maintainer, version, herald, remember, forget, whois"
53                end
54        end
55       
56        def callPort(*args)
57                Utils.safe_exec("/opt/local/bin/port", *args)
58        end
59       
60        def doPort(m, *args)
61                Thread.new do
62                        text = callPort(*args)
63                        m.reply text
64                end
65        end
66       
67        def info(m, params)
68                doPort(m, "info", params[:portname])
69        end
70       
71        def portmaintainer(m, params)
72                doPort(m, "info", "--maintainer", params[:portname])
73        end
74       
75        def portversion(m, params)
76                doPort(m, "info", "--version", params[:portname])
77        end
78       
79        def portsearch(m, params)
80                doPort(m, "search", params[:query])
81        end
82       
83        def herald_enable(m, params)
84                @registry['herald_enable'] = true
85                m.okay
86        end
87       
88        def herald_disable(m, params)
89                @registry['herald_enable'] = false
90                m.okay
91        end
92       
93        def remember(m, params)
94                nick = params[:nick]
95                email = params[:email]
96                @registry["email_#{nick}"] = email
97                m.reply "okay, #{nick} is #{email}"
98        end
99       
100        def forget(m, params)
101                nick = params[:nick]
102                @registry.delete("email_#{nick}")
103                m.okay
104        end
105
106        def whois(m, params)
107                nick = params[:nick]
108                email = @registry["email_#{nick}"]
109                if email
110                        heraldUser m.replyto, nick
111                else
112                        m.reply "I don't know #{nick}"
113                end
114        end
115       
116        def textEnumeration(a)
117                sz = a.size
118                case sz
119                        when 0
120                                return ""
121                        when 1
122                                return a[0]
123                        when 2
124                                return a.join(' and ')
125                        else
126                                return a.slice(0, sz-1).join(', ') + ', and ' + a[sz-1]
127                end
128        end
129       
130        def heraldUser(where, nick)
131                Thread.new do
132                        email = @registry["email_#{nick}"]
133                        if email
134                                text = callPort("echo", "maintainer:#{email}")
135                                ports = text.split(/\s+/)
136                                portCount = ports.size
137                                showMax = 4
138                                somePorts = ports.extend(Shuffle).shuffle!.slice(0, showMax)
139                               
140                                if (portCount == 0)
141                                        @bot.say where, "#{nick} is #{email}"
142                                elsif (portCount <= showMax)
143                                        @bot.say where, "#{nick} is #{email} and maintainer of " +
144                                                textEnumeration(somePorts)
145                                else
146                                        @bot.say where, "#{nick} is #{email} and maintainer of " +
147                                                textEnumeration(somePorts) +
148                                                " (of #{portCount} total)"
149                                end     
150                        end
151                end
152        end
153       
154        def maybeHerald(where, nick)
155                now = Time.new
156                minSecondsBetween = 60*10
157               
158                doHerald = true
159                email = @registry["email_#{nick}"]
160                if (email)
161                        lastHerald = @registry["lastherald_#{email}"]
162                        if (lastHerald)
163                                secondsAgo = now - lastHerald
164                                doHerald = secondsAgo > minSecondsBetween
165                        end
166                        @registry["lastherald_#{email}"] = now
167                end
168               
169                heraldUser where, nick if doHerald
170        end
171       
172        def join(m)
173                maybeHerald m.target, m.sourcenick
174        end
175       
176        def part(m)
177                nick = m.sourcenick
178                email = @registry["email_#{nick}"]
179                @registry["lastherald_#{email}"] = Time.new if email
180        end
181       
182        def nick(m)
183                newnick = m.message
184                @bot.channels.each_value { |c|
185                        if(c.users.has_key?(newnick))
186                                maybeHerald c.name, newnick
187                        end
188                }
189        end
190
191end
192
193plugin = PortPlugin.new
194plugin.map 'port info :portname', :action => 'info'
195plugin.map 'port maintainer :portname', :action => 'portmaintainer'
196plugin.map 'port version :portname', :action => 'portversion'
197#plugin.map 'port search :query', :action => 'portsearch'
198
199plugin.map 'port herald enable', :action => 'herald_enable'
200plugin.map 'port herald disable', :action => 'herald_disable'
201plugin.map 'port remember :nick email :email', :action => 'remember'
202plugin.map 'port forget :nick', :action => 'forget'
203plugin.map 'port whois :nick', :action => 'whois'
Note: See TracBrowser for help on using the repository browser.