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()
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)
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)