from __future__ import nested_scopes
+import twistfix
+twistfix.main()
+
# Sibling imports
from twisted.protocols.basic import LineReceiver
from twisted.web.http import HTTPClient
MSN_CVR_STR = "0x040c winnt 5.1 i386 MSNMSGR 7.0.0777 msmsgs"
MSN_AVATAR_GUID = "{A4268EEC-FEC5-49E5-95C3-F126696BDBF6}"
MSN_MSNFTP_GUID = "{5D3E02AB-6190-11D3-BBBB-00C04F795683}"
+MSN_MAXINT = 2**31 - 1
# auth constants
LOGIN_SUCCESS = 1
Used to represent a MSNObject. This can be currently only be an avatar.
@ivar creator: The userHandle of the creator of this picture.
- @ivar imageData: The PNG image data (only for our own avatar)
+ @ivar imageDataFunc: A function to return the PNG image data (only for our own avatar)
@ivar type: Always set to 3, for avatar.
@ivar size: The size of the image.
@ivar location: The filename of the image.
if s:
self.parse(s)
- def setData(self, creator, imageData):
+ def setData(self, creator, imageDataFunc):
""" Set the creator and imageData for this object """
+ imageData = imageDataFunc()
self.creator = creator
- self.imageData = imageData
+ self.imageDataFunc = imageDataFunc
self.size = len(imageData)
self.type = 3
self.location = "TMP" + str(random.randint(1000,9999))
def setNull(self):
self.creator = ""
- self.imageData = ""
+ self.imageDataFunc = lambda: None
self.size = 0
self.type = 0
self.location = ""
return (personal,)
return d.addCallback(_cb)
- def changeAvatar(self, imageData, push):
+ def changeAvatar(self, imageDataFunc, push):
"""
Used to change the avatar that other users see.
- @param imageData: the PNG image data to set as the avatar
+ @param imageDataFunc: a function to return the PNG image data to set as the avatar
@param push : whether to push the update to the server
(it will otherwise be sent with the next
changeStatus())
The callback argument will be the same as for changeStatus.
"""
- if self.msnobj and imageData == self.msnobj.imageData: return
- if imageData:
- self.msnobj.setData(self.factory.userHandle, imageData)
+ checkMsnobj = MSNObject()
+ checkMsnobj.setData(self.factory.userHandle, imageDataFunc)
+ if self.msnobj and self.msnobj.sha1d == checkMsnobj.sha1d:
+ return # Avatar hasn't changed
+ if imageDataFunc:
+ # We need to keep the same MSNObject instance, as it is
+ # passed on to SwitchboardClient objects
+ self.msnobj.setData(self.factory.userHandle, imageDataFunc)
else:
self.msnobj.setNull()
- if push: return self.changeStatus(self.factory.status) # Push to server
+ if push:
+ return self.changeStatus(self.factory.status) # Push to server
def requestSwitchboardServer(self):
# Check that we have an avatar to send
if self.msnobj:
slpLink = SLPLink_AvatarSend(remoteUser=slpMessage.fro, switchboard=self, filesize=self.msnobj.size, sessionID=slpMessage.sessionID, sessionGuid=slpMessage.sessionGuid)
- slpLink.write(self.msnobj.imageData)
+ slpLink.write(self.msnobj.imageDataFunc())
slpLink.close()
else:
# They shouldn't have sent a request if we have
if baseID:
self.baseID = baseID
else:
- self.baseID = random.randint(1000, sys.maxint)
+ self.baseID = random.randint(1000, MSN_MAXINT)
self.pos = -1
def get(self):
def __init__(self, remoteUser, switchboard, sessionID, sessionGuid):
self.dataFlag = 0
if not sessionID:
- sessionID = random.randint(1000, sys.maxint)
+ sessionID = random.randint(1000, MSN_MAXINT)
if not sessionGuid:
sessionGuid = random_guid()
self.remoteUser = remoteUser
binaryFields[1] = self.seqID.next()
binaryFields[3] = len(msgStr)
binaryFields[4] = binaryFields[3]
- binaryFields[6] = random.randint(1000, sys.maxint)
+ binaryFields[6] = random.randint(1000, MSN_MAXINT)
self.sendP2PMessage(binaryFields, msgStr)
def sendP2PMessage(self, binaryFields, msgStr):
binaryFields[1] = self.seqID.next()
binaryFields[3] = 4
binaryFields[4] = 4
- binaryFields[6] = random.randint(1000, sys.maxint)
+ binaryFields[6] = random.randint(1000, MSN_MAXINT)
binaryFields[9] = 1
self.sendP2PMessage(binaryFields, chr(0) * 4)
binaryFields[3] = self.filesize
binaryFields[4] = len(chunk)
binaryFields[5] = self.dataFlag
- binaryFields[6] = random.randint(1000, sys.maxint)
+ binaryFields[6] = random.randint(1000, MSN_MAXINT)
binaryFields[9] = 1
self.offset += len(chunk)
self.sendP2PMessage(binaryFields, chunk)