#! /usr/bin/python
#  -*- coding: shift-jis -*-

from twisted.application import service, internet
from twisted.web import server, resource
from twisted.internet import reactor

# IRC server implementaition
from twisted.words.protocols.irc import IRC
from twisted.internet.protocol import ServerFactory
from twisted.words.service import IRCUser
from twisted.words.service import IRCFactory,InMemoryWordsRealm
from twisted.cred.portal import Portal
from twisted.cred.checkers import InMemoryUsernamePasswordDatabaseDontUse

chatlog = []
        
def addComment(comment):
    chatlog.insert(0, comment)

def getComment(request):
    if 'comment' in request.args:
        return request.args['comment'][0]

def renderChatLog():
    return template % '<br>'.join(chatlog)

users = []
            
class MyIRCUser(IRCUser):
    def receive(self, sender, recipient, message):
        addComment(message["text"])
        IRCUser.receive(self, sender, recipient, message)

    def _cbLogin(self, (iface, avatar, logout)):
        users.append(self)
        IRCUser._cbLogin(self, (iface, avatar, logout))


# simple web ui written by tahara-sensei
template = """
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=sjis">
</head>
<body>

<form action="" method="post">
<input type="text" name="comment">
<input type="submit" value="‘—M">
</form>
%s
</body>
</html>
"""

class MyResource(resource.Resource):
    def render(self, request):
        comment = getComment(request)
        if comment:
            addComment(comment)
            for user in users:
                user.privmsg("irc", "irc", comment)
        return renderChatLog()

class MyResourceRoot(resource.Resource):
    def getChild(self, name, request):
        return MyResource()




if __name__ == '__main__':
    realm = InMemoryWordsRealm("liris")
    checker = InMemoryUsernamePasswordDatabaseDontUse()
    checker.addUser("liris", "password")
    checker.addUser("test", "password")
    portal = Portal(realm, [checker])
    factory = IRCFactory(realm, portal)
    factory.protocol = MyIRCUser
    reactor.listenTCP(3333, factory)

    root = MyResourceRoot()
    site = server.Site(root)
    reactor.listenTCP(8080, site)
    reactor.run()

