Changeset 56642 in webkit


Ignore:
Timestamp:
Mar 26, 2010 2:45:56 PM (14 years ago)
Author:
abarth@webkit.org
Message:

2010-03-26 Adam Barth <abarth@webkit.org>

Reviewed by Eric Seidel.

Refactor IRCBot controller logic to allow for commands
https://bugs.webkit.org/show_bug.cgi?id=36676

We need to move the controller logic into the tool package so it can
know about commands. The changes to queueengine could go in a
different patch, but we're going to need it anyway.

  • Scripts/webkitpy/common/config/irc.py: Added.
  • Scripts/webkitpy/common/net/irc/ircbot.py:
  • Scripts/webkitpy/common/net/irc/ircproxy.py:
  • Scripts/webkitpy/tool/bot/queueengine.py:
  • Scripts/webkitpy/tool/bot/sheriffircbot.py: Added.
  • Scripts/webkitpy/tool/commands/sheriffbot.py:
  • Scripts/webkitpy/tool/main.py:
  • Scripts/webkitpy/tool/mocktool.py:
Location:
trunk/WebKitTools
Files:
1 added
7 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/WebKitTools/ChangeLog

    r56640 r56642  
     12010-03-26  Adam Barth  <abarth@webkit.org>
     2
     3        Reviewed by Eric Seidel.
     4
     5        Refactor IRCBot controller logic to allow for commands
     6        https://bugs.webkit.org/show_bug.cgi?id=36676
     7
     8        We need to move the controller logic into the tool package so it can
     9        know about commands.  The changes to queueengine could go in a
     10        different patch, but we're going to need it anyway.
     11
     12        * Scripts/webkitpy/common/config/irc.py: Added.
     13        * Scripts/webkitpy/common/net/irc/ircbot.py:
     14        * Scripts/webkitpy/common/net/irc/ircproxy.py:
     15        * Scripts/webkitpy/tool/bot/queueengine.py:
     16        * Scripts/webkitpy/tool/bot/sheriffircbot.py: Added.
     17        * Scripts/webkitpy/tool/commands/sheriffbot.py:
     18        * Scripts/webkitpy/tool/main.py:
     19        * Scripts/webkitpy/tool/mocktool.py:
     20
    1212010-03-26  Adam Barth  <abarth@webkit.org>
    222
  • trunk/WebKitTools/Scripts/webkitpy/common/net/irc/ircbot.py

    r56640 r56642  
    2727# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    2828
     29import webkitpy.common.config as config
     30
    2931from webkitpy.common.thread.messagepump import MessagePump, MessagePumpDelegate
    3032from webkitpy.thirdparty.autoinstalled import ircbot
    3133from webkitpy.thirdparty.autoinstalled import irclib
     34
     35
     36class IRCBotDelegate(object):
     37    def irc_message_received(self, message):
     38        raise NotImplementedError, "subclasses must implement"
     39
     40    def irc_nickname(self):
     41        raise NotImplementedError, "subclasses must implement"
     42
     43    def irc_password(self):
     44        raise NotImplementedError, "subclasses must implement"
    3245
    3346
     
    3649    def __init__(self,
    3750                 message_queue,
    38                  server="irc.freenode.net",
    39                  port=6667,
    40                  nickname="sheriffbot",
    41                  password=None, # sheriffbot actually needs a password.
    42                  channel="#webkit"):
     51                 delegate):
    4352        self._message_queue = message_queue
    44         ircbot.SingleServerIRCBot.__init__(self, [(server, port, password)], nickname, nickname)
    45         self._channel = channel
     53        self._delegate = delegate
     54        ircbot.SingleServerIRCBot.__init__(
     55            self,
     56            [(
     57                config.irc.server,
     58                config.irc.port,
     59                self._delegate.irc_password()
     60            )],
     61            self._delegate.irc_nickname,
     62            self._delegate.irc_nickname)
     63        self._channel = config.irc.channel
    4664
    4765    # ircbot.SingleServerIRCBot methods
     
    5573
    5674    def on_pubmsg(self, connection, event):
    57         salute = event.arguments()[0].split(":", 1)
    58         if len(salute) > 1 and irclib.irc_lower(salute[0]) == irclib.irc_lower(self.connection.get_nickname()):
    59             connection.privmsg(self._channel, '"Only you can prevent forest fires." -- Smokey the Bear')
     75        request = event.arguments()[0].split(":", 1)
     76        if len(request) > 1 and irclib.irc_lower(request[0]) == irclib.irc_lower(self.connection.get_nickname()):
     77            response = self._delegate.irc_message_received(request[1])
     78            if response:
     79                connection.privmsg(self._channel, response)
    6080
    6181    # MessagePumpDelegate methods
  • trunk/WebKitTools/Scripts/webkitpy/common/net/irc/ircproxy.py

    r56640 r56642  
    3535
    3636class _IRCThread(threading.Thread):
    37     def __init__(self, message_queue, bot_class, password):
     37    def __init__(self, message_queue, irc_delegate):
    3838        threading.Thread.__init__(self)
    3939        self.setDaemon(True)
    4040        self._message_queue = message_queue
    41         self._bot_class = bot_class
    42         self._password = password
     41        self._irc_delegate = irc_delegate
    4342
    4443    def run(self):
    45         bot = self._bot_class(self._message_queue, password=self._password)
     44        bot = IRCBot(self._message_queue, self.irc_delegate)
    4645        bot.start()
    4746
    4847
    4948class IRCProxy(object):
    50     def __init__(self, bot_class=IRCBot, password=None):
     49    def __init__(self, irc_delegate):
    5150        log("Connecting to IRC")
    5251        self._message_queue = ThreadedMessageQueue()
    53         self._child_thread = _IRCThread(self._message_queue, bot_class, password=password)
     52        self._child_thread = _IRCThread(self._message_queue, irc_delegate)
    5453        self._child_thread.start()
    5554
     
    6160        self._message_queue.stop()
    6261        self._child_thread.join()
    63 
  • trunk/WebKitTools/Scripts/webkitpy/tool/bot/queueengine.py

    r56586 r56642  
    6666
    6767class QueueEngine:
    68     def __init__(self, name, delegate):
     68    def __init__(self, name, delegate, message_queue=None):
    6969        self._name = name
    7070        self._delegate = delegate
     71        self._message_queue = message_queue
    7172        self._output_tee = OutputTee()
    7273
     
    133134            self._work_log = None
    134135
    135     @classmethod
    136     def _sleep_message(cls, message):
     136    def _sleep_message(self, message):
    137137        wake_time = datetime.now() + timedelta(seconds=cls.seconds_to_sleep)
    138138        return "%s Sleeping until %s (%s)." % (message, wake_time.strftime(cls.log_date_format), cls.sleep_duration_text)
    139139
    140     @classmethod
    141     def _sleep(cls, message):
    142         log(cls._sleep_message(message))
    143         time.sleep(cls.seconds_to_sleep)
     140    def _sleep(self, message):
     141        log(self._sleep_message(message))
     142        if self._message_queue:
     143            self._message_queue.wait(self.seconds_to_sleep)
     144        else:
     145            time.sleep(self.seconds_to_sleep)
  • trunk/WebKitTools/Scripts/webkitpy/tool/bot/sheriffircbot.py

    r56641 r56642  
    2727# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    2828
    29 import threading
     29from webkitpy.common.net.irc.ircbot import IRCBotDelegate
    3030
    31 from webkitpy.common.net.irc.ircbot import IRCBot
    32 from webkitpy.common.thread.threadedmessagequeue import ThreadedMessageQueue
    33 from webkitpy.common.system.deprecated_logging import log
    34 
    35 
    36 class _IRCThread(threading.Thread):
    37     def __init__(self, message_queue, bot_class, password):
    38         threading.Thread.__init__(self)
    39         self.setDaemon(True)
    40         self._message_queue = message_queue
    41         self._bot_class = bot_class
     31class SheriffIRCBot(IRCBotDelegate):
     32    def __init__(self, password):
    4233        self._password = password
    4334
    44     def run(self):
    45         bot = self._bot_class(self._message_queue, password=self._password)
    46         bot.start()
     35    # IRCBotDelegate methods
    4736
     37    def irc_message_received(self, message):
     38        return '"Only you can prevent forest fires." -- Smokey the Bear'
    4839
    49 class IRCProxy(object):
    50     def __init__(self, bot_class=IRCBot, password=None):
    51         log("Connecting to IRC")
    52         self._message_queue = ThreadedMessageQueue()
    53         self._child_thread = _IRCThread(self._message_queue, bot_class, password=password)
    54         self._child_thread.start()
     40    def irc_nickname(self):
     41        return "sheriffbot"
    5542
    56     def post(self, message):
    57         self._message_queue.post(message)
    58 
    59     def disconnect(self):
    60         log("Disconnecting from IRC...")
    61         self._message_queue.stop()
    62         self._child_thread.join()
    63 
     43    def irc_password(self):
     44        return self._password
  • trunk/WebKitTools/Scripts/webkitpy/tool/commands/sheriffbot.py

    r56586 r56642  
    2929import os
    3030
    31 from webkitpy.tool.commands.queues import AbstractQueue
    3231from webkitpy.common.system.deprecated_logging import log
    3332from webkitpy.common.config.ports import WebKitPort
    34 
     33from webkitpy.tool.bot.sheriffircbot import SheriffIRCBot
     34from webkitpy.tool.commands.queues import AbstractQueue
    3535
    3636class SheriffBot(AbstractQueue):
     
    4444    def begin_work_queue(self):
    4545        AbstractQueue.begin_work_queue(self)
    46         self.tool.ensure_irc_connected()
     46        self._irc_delegate = SheriffIRCBot(self.tool.irc_password)
     47        self.tool.ensure_irc_connected(self._irc_delegate)
    4748
    4849    def work_item_log_path(self, failure_info):
  • trunk/WebKitTools/Scripts/webkitpy/tool/main.py

    r56544 r56642  
    9191        return self._checkout
    9292
    93     # FIXME: Add a parameter for nickname?
    94     def ensure_irc_connected(self):
     93    def ensure_irc_connected(self, irc_delegate):
    9594        if not self._irc:
    96             self._irc = IRCProxy(password=self._irc_password)
     95            self._irc = IRCProxy(irc_delegate)
    9796
    9897    def irc(self):
     
    124123            self.status_server.set_host(options.status_host)
    125124        if options.irc_password:
    126             self._irc_password = options.irc_password
     125            self.irc_password = options.irc_password
    127126
    128127    def should_execute_command(self, command):
  • trunk/WebKitTools/Scripts/webkitpy/tool/mocktool.py

    r56601 r56642  
    446446        self._checkout = MockCheckout()
    447447        self.status_server = MockStatusServer()
     448        self.irc_password = "MOCK irc password"
    448449
    449450    def scm(self):
     
    453454        return self._checkout
    454455
    455     def ensure_irc_connected(self):
     456    def ensure_irc_connected(self, delegate):
    456457        if not self._irc:
    457458            self._irc = MockIRC()
Note: See TracChangeset for help on using the changeset viewer.