#!/usr/bin/env python

# Copyright (c) Twisted Matrix Laboratories.
# See LICENSE for details.

"""
A very simple example of C{twisted.words.protocols.oscar} code

To run the script:

    $ python oscardemo.py
"""

from __future__ import print_function

from twisted.words.protocols import oscar
from twisted.internet import protocol, reactor
import getpass

SN = raw_input('Username: ') # replace this with a screenname
PASS =  getpass.getpass('Password: ')# replace this with a password
if SN[0].isdigit():
    icqMode = 1
    hostport = ('login.icq.com', 5238)
else:
    hostport = ('login.oscar.aol.com', 5190)
    icqMode = 0

class B(oscar.BOSConnection):
    capabilities = [oscar.CAP_CHAT]
    def initDone(self):
        self.requestSelfInfo().addCallback(self.gotSelfInfo)
        self.requestSSI().addCallback(self.gotBuddyList)
    def gotSelfInfo(self, user):
        print(user.__dict__)
        self.name = user.name
    def gotBuddyList(self, l):
        print(l)
        self.activateSSI()
        self.setProfile("""this is a test of the current twisted.oscar code.<br>
current features:<br>
* send me a message, and you should get it back.<br>
* invite me to a chat room.  i'll repeat what people say.  say 'leave' and i'll go.<br>
* also, i hang out in '%s Chat'.  join that, i'll repeat what you say there.<br>
* try warning me.  just try it.<br>
<br>
if any of those features don't work, tell paul (Z3Penguin).  thanks."""%SN)
        self.setIdleTime(0)
        self.clientReady()
        self.createChat('%s Chat'%SN).addCallback(self.createdRoom)
    def createdRoom(self, result):
        (exchange, fullName, instance) = result
        print('created room', exchange, fullName, instance)
        self.joinChat(exchange, fullName, instance).addCallback(self.chatJoined)
    def updateBuddy(self, user):
        print(user)
    def offlineBuddy(self, user):
        print('offline', user.name)
    def receiveMessage(self, user, multiparts, flags):
        print(user.name, multiparts, flags)
        self.getAway(user.name).addCallback(self.gotAway, user.name)
        if multiparts[0][0].find('away')!=-1:
            self.setAway('I am away from my computer right now.')
        elif multiparts[0][0].find('back')!=-1:
            self.setAway(None)
        if self.awayMessage:
            self.sendMessage(user.name,'<html><font color="#0000ff">'+self.awayMessage,autoResponse=1)
        else:
            self.lastUser = user.name
            self.sendMessage(user.name, multiparts, wantAck = 1, autoResponse = (self.awayMessage!=None)).addCallback( \
                self.messageAck)
    def messageAck(self, result):
        (username, message) = result
        print('message sent to %s acked' % username)
    def gotAway(self, away, user):
        if away != None:
            print('got away for',user,':',away)
    def receiveWarning(self, newLevel, user):
        print('got warning from', hasattr(user,'name') and user.name or None)
        print('new warning level', newLevel)
        if not user:
            #username = self.lastUser
            return
        else:
            username = user.name
        self.warnUser(username).addCallback(self.warnedUser, username)
    def warnedUser(self, oldLevel, newLevel, username):
        self.sendMessage(username,'muahaha :-p')
    def receiveChatInvite(self, user, message, exchange, fullName, instance, shortName, inviteTime):
            print('chat invite from',user.name,'for room',shortName,'with message:',message)
            self.joinChat(exchange, fullName, instance).addCallback(self.chatJoined)
    def chatJoined(self, chat):
        print('joined chat room', chat.name)
        print('members:',map(lambda x:x.name,chat.members))
    def chatReceiveMessage(self, chat, user, message):
        print('message to',chat.name,'from',user.name,':',message)
        if user.name!=self.name: chat.sendMessage(user.name+': '+message)
        if message.find('leave')!=-1 and chat.name!='%s Chat'%SN: chat.leaveChat()
    def chatMemberJoined(self, chat, member):
        print(member.name,'joined',chat.name)
    def chatMemberLeft(self, chat, member):
        print(member.name,'left',chat.name)
        print('current members',map(lambda x:x.name,chat.members))
        if chat.name!="%s Chat"%SN and len(chat.members)==1:
            print('leaving', chat.name)
            chat.leaveChat()

class OA(oscar.OscarAuthenticator):
   BOSClass = B

protocol.ClientCreator(reactor, OA, SN, PASS, icq=icqMode).connectTCP(*hostport)
reactor.run()
