# Path: logviewer/exc.py
# class AuthenticationError(RuntimeError):
#     pass
# 
# Path: logviewer/parser.py
# def parse_log(fp, start=None):
#     def extract_time(match):
#         t = match.group('timestamp')
#         try:
#             # ISO 8601
#             timestamp = t.split('.')[0]
#             return datetime.strptime(timestamp, '%Y-%m-%dT%H:%M:%S')
#         except ValueError:
#             # RFC 2822
#             t = email.utils.parsedate(t)
#             if t is not None:
#             	t = time.mktime(t)
#             else:
#             	t = 0 # fail
#             return datetime.fromtimestamp(t)
# 
#     no = 0
#     for line in fp:
#         m = LINE_PATTERN.match(line)
#         if not m:
#             continue
# 
#         if 'PRIVMSG' in m.group('data'):
#             no += 1
# 
#             if start and no < start:
#                 continue
#             pm = PRIVMSG_PATTERN.match(m.group('data'))
#             if not pm:
#                 continue
# 
#             is_bot = not pm.group('nick')
#             pmm = PROXY_MSG_PATTERN.match(pm.group('text'))
#             if is_bot and pmm:
#                 nick = pmm.group('nick')
#                 text = pmm.group('text')
#                 is_bot = False
#             else:
#                 nick = pm.group('nick')
#                 text = pm.group('text')
# 
#             yield dict(type='privmsg', no=no,
#                 time=extract_time(m),
#                 nick=nick, text=text, is_bot=is_bot)
#         elif (m.group('dir') == '>>>' and start is None and
#               m.group('data').startswith('JOIN ') and
#               JOIN_PATTERN.match(m.group('data'))):
#             yield dict(type='join', time=extract_time(m), is_bot=True, no=-1)
# 
# Path: logviewer/routing.py
# class DateConverter(BaseConverter):
#     def to_python(self, value):
#     def to_url(self, value):
# 
# Path: logviewer/util.py
# def irc_channels(config):


import os
import io
import re
import time
import json
import random
import datetime
import itertools
import functools
import sqlite3
import sphinxapi
import flask
from contextlib import closing
from flask import (Flask, request, redirect, session, url_for, render_template,
                   current_app, jsonify)
from logviewer.exc import AuthenticationError
from logviewer.parser import parse_log
from logviewer import routing, util
        with io.open(self.path, encoding='utf-8', errors='replace') as fp:
            for msg in parse_log(fp, start):
                yield msg

    @staticmethod
    def today(channel):
        return Log(channel, datetime.date.today())

    @property
    def yesterday(self):
        return Log('#' + self.name, self.date - datetime.timedelta(days=1))


CANONICAL_PATTERN = re.compile(r'^[\^\|_]*([^\^\|_]*).*$')
def canonical(value):
    value = value.lower()
    m = CANONICAL_PATTERN.search(value)
    if m is not None:
        return m.group(1)
    else:
        return value


def hashed(value, limit):
    return hash(value) % limit

app.jinja_env.filters.update(canonical=canonical, hash=hashed)


def get_default_channel():

# Path: logviewer/exc.py
# class AuthenticationError(RuntimeError):
#     pass
# 
# Path: logviewer/parser.py
# def parse_log(fp, start=None):
#     def extract_time(match):
#         t = match.group('timestamp')
#         try:
#             # ISO 8601
#             timestamp = t.split('.')[0]
#             return datetime.strptime(timestamp, '%Y-%m-%dT%H:%M:%S')
#         except ValueError:
#             # RFC 2822
#             t = email.utils.parsedate(t)
#             if t is not None:
#             	t = time.mktime(t)
#             else:
#             	t = 0 # fail
#             return datetime.fromtimestamp(t)
# 
#     no = 0
#     for line in fp:
#         m = LINE_PATTERN.match(line)
#         if not m:
#             continue
# 
#         if 'PRIVMSG' in m.group('data'):
#             no += 1
# 
#             if start and no < start:
#                 continue
#             pm = PRIVMSG_PATTERN.match(m.group('data'))
#             if not pm:
#                 continue
# 
#             is_bot = not pm.group('nick')
#             pmm = PROXY_MSG_PATTERN.match(pm.group('text'))
#             if is_bot and pmm:
#                 nick = pmm.group('nick')
#                 text = pmm.group('text')
#                 is_bot = False
#             else:
#                 nick = pm.group('nick')
#                 text = pm.group('text')
# 
#             yield dict(type='privmsg', no=no,
#                 time=extract_time(m),
#                 nick=nick, text=text, is_bot=is_bot)
#         elif (m.group('dir') == '>>>' and start is None and
#               m.group('data').startswith('JOIN ') and
#               JOIN_PATTERN.match(m.group('data'))):
#             yield dict(type='join', time=extract_time(m), is_bot=True, no=-1)
# 
# Path: logviewer/routing.py
# class DateConverter(BaseConverter):
#     def to_python(self, value):
#     def to_url(self, value):
# 
# Path: logviewer/util.py
# def irc_channels(config):


# Path: logviewer/app.py
import os
import io
import re
import time
import json
import random
import datetime
import itertools
import functools
import sqlite3
import sphinxapi
import flask
from contextlib import closing
from flask import (Flask, request, redirect, session, url_for, render_template,
                   current_app, jsonify)
from logviewer.exc import AuthenticationError
from logviewer.parser import parse_log
from logviewer import routing, util

        with io.open(self.path, encoding='utf-8', errors='replace') as fp:
            for msg in parse_log(fp, start):
                yield msg

    @staticmethod
    def today(channel):
        return Log(channel, datetime.date.today())

    @property
    def yesterday(self):
        return Log('#' + self.name, self.date - datetime.timedelta(days=1))


CANONICAL_PATTERN = re.compile(r'^[\^\|_]*([^\^\|_]*).*$')
def canonical(value):
    value = value.lower()
    m = CANONICAL_PATTERN.search(value)
    if m is not None:
        return m.group(1)
    else:
        return value


def hashed(value, limit):
    return hash(value) % limit

app.jinja_env.filters.update(canonical=canonical, hash=hashed)


def get_default_channel():

    return util.irc_channels(current_app.config['IRC_CHANNELS'])[0]