def setUp(self): self.env = EnvironmentStub() self.out = FileIRCLogProvider(self.env) self.chmgr = IRCChannelManager(self.env) self.supylines = ( '2008-05-03T02:28:19 <rcorsaro> will it work if I install it?', '2008-05-03T02:30:22 <dgynn> ok. i copied it over', '2008-05-03T02:30:25 *** dgynn has left #etf', '2008-05-03T02:30:26 *** dgynn has joined #etf', '2008-05-03T02:30:27 *** dgynn has quit IRC', '2008-05-03T02:31:27 * cbalan feels lonely...', '2008-05-03T02:32:27 * rcorsaro nods', '2008-05-03T02:33:27 *** vmiliano was kicked by dgynn (dgynn)', '2008-05-03T02:34:27 *** rcorsaro sets mode: +o cbalan', '2008-05-03T02:35:27 *** dgynn changes topic to "Enterprise Tools and Frameworks"', '2008-05-03T02:36:27 *** rcorsaro is now known as bobby-robert', '2008-05-03T02:37:27 -rcorsaro- hello there', '2008-08-15T02:37:27 -rcorsaro- goodbye there', '* SOME SPECIAL MESSAGE *', ) self.simplegozerlines = ( '2009-07-03 22:18:00 | <rcorsaro> !chatlog-on', '2009-07-03 22:19:00 | <gozerbot> chatlog enabled on (default,#test2)', '2009-07-03 22:20:00 | gozerbot ([email protected]) has left', '2009-07-03 22:21:00 | gozerbot ([email protected]) has joined', '2009-07-03 22:22:00 | rcorsaro ([email protected]) has quit: Quit: leaving', '2009-07-03 22:23:00 | * rcorsaro2 is strong', '2009-07-03 22:24:00 | * rcorsaro feels strange', '2009-07-03 22:25:00 | gozerbot was kicked by rcorsaro2 (rcorsaro2)', '2009-07-03 22:26:00 | rcorsaro2 sets mode: -o gozerbot', '2009-07-03 22:27:00 | rcorsaro2 changes topic to "testing topic"', '2009-07-03 22:28:00 | rcorsaro ([email protected]) is now known as rcorsaro2', '2009-07-03 22:29:00 | -rcorsaro- hello there', '* SOME SPECIAL MESSAGE *', ) # supybot emulation on gozerbot self.supygozerlines = ( '2009-07-03T22:18:00 <gozerbot> chatlog enabled on (default,#test2)', '2009-07-03T22:19:00 <rcorsaro> hello', '2009-07-03T22:20:00 *** rcorsaro_ ([email protected]) has left', '2009-07-03T22:21:00 *** rcorsaro_ ([email protected]) has joined', '2009-07-03T22:22:00 *** rcorsaro_ ([email protected]) has quit: Quit: leaving', '2009-07-03T22:23:00 * rcorsaro is strong', '2009-07-03T22:24:00 * rcorsaro is manly', '2009-07-03T22:25:00 *** rcorsaro_ was kicked by rcorsaro (rcorsaro)', '2009-07-03T22:26:00 *** rcorsaro sets mode: +o rcorsaro_', '2009-07-03T22:27:00 *** rcorsaro changes topic to "testing topic"', '2009-07-03T22:28:00 *** lsjdf ([email protected]) is now known as rcorsaro2', '2009-07-03T22:29:00 -rcorsaro- hello there', '* SOME SPECIAL MESSAGE *', )
def expand_macro(self, formatter, name, content): _, kw = parse_args(content) channel_name = kw.get('channel') utc_dt = kw.get('datetime') if not utc_dt: return system_message('IrcLogQuote: arguments required '\ '(channel=channel, datetime=timestamp(UTCYYYY-MM-DDTHH:MM:SS), '\ 'offset=seonds)') d = self.date_re.match(utc_dt.strip()) if not d: return system_message('IrcLogQuote: Invalid timestamp format') offset = int(kw.get('offset', 10)) irclogs = IrcLogsView(self.env) ch_mgr = IRCChannelManager(self.env) start = datetime(*strptime(utc_dt, self.date_format)[:6]) start = UTC.localize(start) start = ch_mgr.to_user_tz(formatter.req, start) end = start + timedelta(seconds=offset) channel = ch_mgr.channel(channel_name) formatter.req.perm.assert_permission(channel.perm()) lines = channel.events_in_range(start, end) lines = filter(lambda x: not x.get('hidden'), map(irclogs._map_lines, lines)) rows = map(irclogs._render_line, lines) add_stylesheet(formatter.req, 'irclogs/css/irclogs.css') data = Chrome(self.env).populate_data( formatter.req, { 'channel': channel_name, 'lines': lines, 'year': '%04d' % (start.year), 'month': '%02d' % (start.month), 'day': '%02d' % (start.day), 'time': start.strftime("%H:%M:%S"), 'rows': rows }) return Chrome(self.env).load_template('macro_quote.html') \ .generate(**data)
def setUp(self): self.indexdir = os.tempnam() self.env = EnvironmentStub() self.config = self.env.config self.config.set('irclogs', 'search_db_path', self.indexdir) self.config.set('irclogs', 'last_index', None) self.chmgr = IRCChannelManager(self.env) def events(start, end): self.assertTrue(start < end) self.dt = start dt = self.dt delta = timedelta(seconds=1) for i in range(0, 20): yield { 'timestamp': dt, 'network': u'freenode', 'channel': u'#trac', 'nick': u'doki_pen', 'type': u'comment', 'comment': u'hello %d' % i } dt += delta def fake_channels(): obj = IRCChannel(self.env) obj.events_in_range = events yield obj def fake_channel(name): obj = IRCChannel(self.env) obj.events_in_range = events return obj self.chmgr.channels = fake_channels self.chmgr.channel = fake_channel self.out = WhooshIrcLogsIndex(self.env)
def _format_link(self, formatter, ns, target, label): m = self.date_re.match(target) if not m: return system_message( 'Invalid IRC Log Link: ' 'Must be of the format channel-UTCYYYY-MM-DDTHH:MM:SS %s') if not m.group('datetime'): return html.a(label, title=label, href=formatter.href.irclogs(m.group('channel'))) else: ch_mgr = IRCChannelManager(self.env) t = strptime(m.group('datetime'), self.date_format) dt = UTC.localize(datetime(*t[:6])) dt = ch_mgr.to_user_tz(formatter.req, dt) timestr = dt.strftime(self.time_format) return html.a(label, title=label, href=formatter.href.irclogs( m.group('channel'), '%02d' % dt.year, '%02d' % dt.month, '%02d' % dt.day, ) + '#%s' % timestr)
def get_events_in_range(self, ch, start, end): global ENCODED_FIELDS ch_mgr = IRCChannelManager(self.env) self.log.debug(ch.settings()) def_tzname = self.config.get('irclogs', 'timezone', 'utc') tzname = ch.setting('timezone', def_tzname) try: tz = timezone(tzname) except UnknownTimeZoneError: self.log.warn("input timezone %s not supported, irclogs will be "\ "parsed as UTC") tzname = 'UTC' tz = timezone(tzname) cnx = self._getdb(ch) try: ttz = timezone(start.tzname()) except UnknownTimeZoneError: self.log.warn("timezone %s not supported, irclog output will be "\ "%s"%(start.tzname(), tzname)) ttz = tz try: self.log.debug("""executing SELECT * FROM chatlog WHERE network = %s AND target = %s AND time >= %s AND time < %s ORDER BY "time" """) self.log.debug("with %s, %s, %s, %s" % (ch.network() or '', ch.channel(), start, end)) cur = cnx.cursor() cur.execute( """ SELECT * FROM chatlog WHERE network = %s AND target = %s AND time >= %s AND time < %s ORDER BY "time" """, (ch.network() or '', ch.channel(), start, end)) ignore_charset = False for l in cur: timestamp = l[1] timestamp = tz.localize(timestamp) dt = ttz.normalize(timestamp.astimezone(ttz)) line = { 'timestamp': dt, 'network': l[2], 'channel': l[3], 'nick': l[4], 'type': l[5], 'message': l[6], 'comment': l[6], 'action': l[6].lstrip('* ') } ignore_charset = ignore_charset or isinstance( line['message'], unicode) if (not ignore_charset) and ch.setting('charset'): for k in ENCODED_FIELDS: line[k] = unicode(line[k], ch.setting('charset'), errors='ignore') continue yield line cnx.close() except Exception, e: cnx.close() self.log.error(e) raise e