Example #1
0
 def execute(self, runnable):
     runner = Runner(runnable)
     thread = Thread(ThreadStart(runner))
     thread.IsBackground = True
     thread.Start()
     if not thread.Join(self._timeout * 1000):
         thread.Abort()
         raise self._error
     return runner.get_result()
Example #2
0
class NotifyFlowVelocity(Object):
    @classmethod
    def instance(klass):
        if not hasattr(klass, 'instance_'):
            klass.instance_ = NotifyFlowVelocity()
        return klass.instance_

    def __init__(self):
        # 普通の #Console にコンテキストを追加する
        CurrentSession.AddInManager.GetAddIn[DLRIntegrationAddIn](
        ).BeforeUnload += self.onBeforeUnload
        CurrentSession.PostProcessTimelineStatuses += self.onPostProcessTimelineStatuses
        self.running = False
        self.thread = None

        self.total_status_count = 0
        self.status_count = 0
        self.notify_count = 1

    def start(self):
        if not self.running:
            self.thread = Thread(ThreadStart(self.runProc))
            self.thread.Start()

    def runProc(self):
        self.running = True
        while 1:
            Thread.Sleep(60 * 60 * 1000)
            try:
                self.notify()
            except:
                Trace.WriteLine(sys.exc_info().ToString())
        self.running = False

    def notify(self):
        self.total_status_count += self.status_count
        CurrentSession.SendTwitterGatewayServerMessage(
            "Twitterの流速は 現在: %d, 平均: %d です。" %
            (self.status_count, self.total_status_count / self.notify_count))
        self.status_count = 0
        self.notify_count += 1

    def onPostProcessTimelineStatuses(self, sender, e):
        if not e.IsFirstTime:
            self.status_count += len(e.Statuses.Status)

    def onBeforeUnload(self, sender, e):
        CurrentSession.PostProcessTimelineStatuses -= self.onPostProcessTimelineStatuses
        self.thread.Abort()
        self.thread.Join(5000)
Example #3
0
class Watcher(Object):
    @classmethod
    def instance(klass):
        if not hasattr(klass, 'instance_'):
            klass.instance_ = Watcher()
        return klass.instance_

    def __init__(self):
        CurrentSession.AddInManager.GetAddIn[DLRIntegrationAddIn](
        ).BeforeUnload += self.onBeforeUnload

        # 普通の #Console にコンテキストを追加する
        CurrentSession.AddInManager.GetAddIn[ConsoleAddIn]().RegisterContext(
            DLRContextHelper.Wrap(CurrentSession, "WatcherContext",
                                  WatcherContext), "Watcher", "指定したユーザを監視します。")

        self.config = DLRBasicConfiguration(
            CurrentSession, "WatcherContext", Dictionary[String, String]({
                "Interval":
                "取得間隔",
                "Targets":
                "ウォッチ対象"
            }))
        self.targets = filter(lambda x: x != "",
                              (self.config.GetValue("Targets")
                               or "").split(","))
        self.interval = int(self.config.GetValue("Interval") or "30", 10)
        self.running = False

        self.thread = None
        self.buffer = {}
        self.re_source = re.compile(r"<span>from (.*?)</span>")
        self.re_statuses = re.compile(r"<li class=\"hentry status.*?</li>")
        self.re_content = re.compile(r"class=\"entry-content\">(.*?)</span>")
        self.re_user = re.compile(
            r"class=\"screen-name\" title=\"([^\"]+)\">(.*?)</a>")
        self.re_user_name = re.compile(
            r"</span> <span class=\"fn\">(.*?)</span></li>")
        self.re_user_screen_name = re.compile(
            r"<meta content=\"([^\"]+)\" name=\"page-user-screen_name\" />")
        self.re_anchor = re.compile(
            r"<a href=\"(http://[^\"]*)\"[^>]*>.*?</a>")
        self.re_tag = re.compile(r"<[^>]*>")
        self.re_status_id = re.compile(r"id=\"status_(\d+)\"")

    def start(self):
        if not self.running:
            CurrentSession.TwitterService.CookieLogin()
            self.thread = Thread(ThreadStart(self.runProc))
            self.thread.Start()

    def runProc(self):
        Trace.WriteLine("Start Watching")
        self.running = True
        while self.interval > 0 and len(self.targets) > 0:
            for target in self.targets:
                try:
                    self.fetch(target)
                except:
                    Trace.WriteLine(sys.exc_info().ToString())
            Thread.Sleep(self.interval * 1000)
        self.running = False
        Trace.WriteLine("Stop Watching")

    def fetch(self, screenName):
        home = CurrentSession.TwitterService.GETWithCookie(
            ("/%s" % screenName))
        statuses = self.re_statuses.findall(home)
        statuses.reverse()

        # User
        m_name = self.re_user_name.search(home)
        m_screen_name = self.re_user_screen_name.search(home)
        user = User()
        user.Id = 0
        user.Name = m_name.group(1)
        user.ScreenName = m_screen_name.group(1)

        if not self.buffer.has_key(user.ScreenName):
            self.buffer[user.ScreenName] = []

        for status in statuses:
            s = Status()

            # Status
            s.User = user
            s.Source = self.re_source.search(status).group(1)
            s.Text = Utility.UnescapeCharReference(
                self.re_tag.sub(
                    r"",
                    self.re_anchor.sub(
                        r"\1",
                        self.re_content.search(status).group(1))))
            s.Id = int(self.re_status_id.search(status).group(1), 10)
            s.CreatedAt = DateTime.Now

            #Trace.WriteLine(s.ToString())
            #Trace.WriteLine(repr(self.buffer[user.ScreenName]))
            # 流れていないものだけ流す
            if not s.Id in self.buffer[user.ScreenName]:
                self.buffer[user.ScreenName].append(s.Id)
                CurrentSession.TwitterService.ProcessStatus(
                    s, Action[Status](lambda s1: CurrentSession.
                                      ProcessTimelineStatus(s1, False, False)))
                if len(self.buffer[user.ScreenName]) > 50:
                    self.buffer[user.ScreenName].pop(0)

    def onBeforeUnload(self, sender, e):
        CurrentSession.AddInManager.GetAddIn[ConsoleAddIn]().UnregisterContext(
            DLRContextHelper.Wrap(CurrentSession, "WatcherContext",
                                  WatcherContext))
        self.interval = 0
        self.thread.Abort()
        self.thread.Join(5000)