Esempio n. 1
0
    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 *',
        )
Esempio n. 2
0
    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)
Esempio n. 3
0
    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)
Esempio n. 4
0
 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)
Esempio n. 5
0
    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