def _onData(self, interest, data): """ Process the incoming Chat data. """ # TODO: Check if this works in Python 3. content = chatbuf_pb2.ChatMessage() content.ParseFromString(data.getContent().toBytes()) if self.getNowMilliseconds() - content.timestamp * 1000.0 < 120000.0: # Use getattr because "from" is a reserved keyword. name = getattr(content, "from") prefix = data.getName().getPrefix(-2).toUri() sessionNo = int(data.getName().get(-2).toEscapedString()) sequenceNo = int(data.getName().get(-1).toEscapedString()) nameAndSession = name + str(sessionNo) l = 0 # Update roster. while l < len(self._roster): entry = self._roster[l] tempName = entry[0:len(entry) - 10] tempSessionNo = int(entry[len(entry) - 10:]) if (name != tempName and content.type != chatbuf_pb2.ChatMessage.LEAVE): l += 1 else: if name == tempName and sessionNo > tempSessionNo: self._roster[l] = nameAndSession break if l == len(self._roster): self._roster.append(nameAndSession) print(name + ": Join") # Set the alive timeout using the Interest timeout mechanism. # TODO: Are we sure using a "/local/timeout" interest is the best # future call approach? timeout = Interest(Name("/local/timeout")) timeout.setInterestLifetimeMilliseconds(120000) self._face.expressInterest( timeout, self._dummyOnData, self._makeAlive(sequenceNo, name, sessionNo, prefix)) # isRecoverySyncState_ was set by sendInterest. # TODO: If isRecoverySyncState_ changed, this assumes that we won't get # data from an interest sent before it changed. # Use getattr because "from" is a reserved keyword. if (content.type == chatbuf_pb2.ChatMessage.CHAT and not self._isRecoverySyncState and getattr(content, "from") != self._screenName): print(getattr(content, "from") + ": " + content.data) elif content.type == chatbuf_pb2.ChatMessage.LEAVE: # leave message try: n = self._roster.index(nameAndSession) if name != self._screenName: self._roster.pop(n) print(name + ": Leave") except ValueError: pass
def _onInterest(self, prefix, interest, face, interestFilterId, filter): """ Send back a Chat Data Packet which contains the user's message. """ content = chatbuf_pb2.ChatMessage() sequenceNo = int(interest.getName().get(self._chatPrefix.size() + 1).toEscapedString()) gotContent = False for i in range(len(self._messageCache) - 1, -1, -1): message = self._messageCache[i] if message.sequenceNo == sequenceNo: if message.messageType != chatbuf_pb2.ChatMessage.CHAT: # Use setattr because "from" is a reserved keyword. setattr(content, "from", self._screenName) content.to = self._chatRoom content.type = message.messageType content.timestamp = int(round(message.time / 1000.0)) else: setattr(content, "from", self._screenName) content.to = self._chatRoom content.type = message.messageType content.data = message.message content.timestamp = int(round(message.time / 1000.0)) gotContent = True break if gotContent: # TODO: Check if this works in Python 3. array = content.SerializeToString() data = Data(interest.getName()) data.setContent(Blob(array)) self._keyChain.sign(data, self._certificateName) try: face.putData(data) except Exception as ex: logging.getLogger(__name__).error( "Error in transport.send: %s", str(ex)) return