def on_message(self, message): ''' handler of message ''' logger.debug(message) # Debug message = json.loads(message) # When we open connection if message['act'] == 'open_connect': self.connection = self.get_connection_or_create(message) self.subscribe(self.get_connection_sign()) if self.connection != False : print '%s_%s Connected!' % ( self.tpa.id, self.current_user.id ) #send message to all people to add me online mes = json.dumps({ "gender":self.current_user.gender, "uid" : str(self.current_user.id), "act" : "add_me_to_online" }) self.broadcast(self.participants, mes) else: print 'Fail connect!' try: if( message['room_type']=='common'): mes = { "act" : "put_me_in_room", "room_id" : message['room_id']} c.publish('%s_%s' % ( self.tpa.id, self.current_user.id ), json.dumps(mes)) if( message['room_type']=='spy'): mes = { 'act': 'add_video_to_slot', 'uid': message['uid'] } c.publish('%s_%s' % ( self.tpa.id, self.current_user.id ), json.dumps(mes)) except: pass # connection from tpa js script if message['act'] == 'tpa_connect': chanel = 'tpa_channel_%s_%s' % (message['tpa_id'], message['user_id']) print 'subscribe from tpa %s' % chanel self.subscribe(chanel) #ChatUser.objects.raw("update main_chatuser set is_online=1 where tpa_id=%s and id=%s" % (message['tpa_id'],message['user_id'])) self.current_user = ChatUser.objects.get(id=message['user_id']) self.place = 'tpa' tpa = Tpa.objects.get(pk=message['tpa_id']) self.tpa = tpa set_user_online(self.current_user, self.tpa) ChatUser.objects.filter(tpa_id=message['tpa_id'], id=message['user_id']).update(is_online=1) #print "update main_chatuser set is_online=1 where tpa_id=%s and id=%s" % (message['tpa_id'],message['user_id']) online_users = ChatUser.objects.raw("select id, user_id from main_chatuser where tpa_id=%s and is_online=1" % message['tpa_id']) with_cam_users = ChatUser.objects.raw("select id, user_id from main_chatuser where tpa_id=%s and is_online=1 and is_camera_active=True" % message['tpa_id']) ou = [] for u in online_users: #cupid24682476web-cupid #define who connected if(int(message['remote_user_id']) != int(u.user_id)): sign_str = '%s%s%s%s' % (tpa.name, message['remote_user_id'], u.user_id, tpa.secret) sign_md5 = md5.new(sign_str).hexdigest() sign_str_rev = '%s%s%s%s' % (tpa.name, u.user_id, message['remote_user_id'], tpa.secret) sign_md5_rev = md5.new(sign_str_rev).hexdigest() common_link = 'http://chat.%s/auth/common/%s/%s/%s/%s' % (tpa.domain, tpa.name, message['remote_user_id'], u.user_id, sign_md5) common_reverse_link = 'http://chat.%s/auth/common/%s/%s/%s/%s' % (tpa.domain, tpa.name, u.user_id, message['remote_user_id'], sign_md5_rev) watch_link = 'http://chat.%s/auth/spy/%s/%s/%s/%s' % (tpa.domain, tpa.name, message['remote_user_id'], u.user_id, sign_md5) watch_reverse_link = 'http://chat.%s/auth/spy/%s/%s/%s/%s' % (tpa.domain, tpa.name, u.user_id, message['remote_user_id'], sign_md5_rev) if(u.is_camera_active==True): is_camera_active = 'yes' else: is_camera_active = 'no' ou.append({ 'user_id': u.user_id, 'common_link': common_link, 'common_reverse_link': common_reverse_link, 'watch_link': watch_link, 'watch_reverse_link': watch_reverse_link, 'is_camera_active': is_camera_active, 'remote_user_id': message['remote_user_id'] }) camu = [] for u in with_cam_users: #cupid24682476web-cupid sign_str = '%s%s%s%s' % (tpa.name, message['remote_user_id'], u.user_id, tpa.secret) sign_md5 = md5.new(sign_str).hexdigest() link = 'http://chat.%s/auth/spy/%s/%s/%s/%s' % (tpa.domain, tpa.name, message['remote_user_id'], u.user_id, sign_md5) camu.append({'user_id': u.user_id, 'link': link}) for u in online_users: mess = {"act" : "update_tpa_online_indicarors", 'user_list': ou } dest = 'tpa_channel_%s_%s' % (message['tpa_id'], u.id) c.publish(dest, json.dumps(mess)) for u in online_users: mess = {"act" : "update_tpa_watch_indicarors", 'cam_list': camu} dest = 'tpa_channel_%s_%s' % (message['tpa_id'], u.id) c.publish(dest, json.dumps(mess)) # disconnection from tpa js script if message['act'] == 'tpa_disconnect': ChatUser.objects.filter(tpa_id=message['tpa_id'], id=message['user_id']).update(is_online=0) if message['act'] == 'refresh_video_indicators': message = {"act" : "refresh_video_indicator"} self.broadcast(self.participants, json.dumps(message)) if message['act'] == 'i_agree_to_private_chat': rooms = self.get_all_active_rooms() #for r in rooms: # r.close_me(self.current_user) ### not need becouse at least one common apponent can invite you to private room = self.get_or_create_room(int(message['caller']),int(message['user_id']),'private') # mark woman as busy for another private invitations if room.typeroom=='private' and self.current_user.gender == 'w': user = ChatUser.objects.get(pk=self.current_user.id) user.now_in_private = True user.save() self.room = room if int(message['caller'])!=self.current_user.pk: caller = int(message['user_id']) else: caller = int(message['caller']) # put woman to room mes = { "act" : "put_me_in_room", "room_id" : room.pk, 'uid' : caller} c.publish('%s_%s' % ( self.tpa.id, self.current_user.pk ), json.dumps(mes)) #put man to room mes = { "act" : "put_me_in_room", "room_id" : room.pk, 'uid' : caller} c.publish('%s_%s' % ( self.tpa.id, message['user_id'] ), json.dumps(mes)) mes = { "act" : "pop_up_message", "message" : _('Woman just accepted your invitation.'), 'delay' : 3000} c.publish('%s_%s' % ( self.tpa.id, message['user_id'] ), json.dumps(mes)) mes = { 'act': 'clear_video_slots' } c.publish('%s_%s' % ( self.tpa.id, message['user_id'] ), json.dumps(mes)) mes = { 'act': 'add_video_to_slot', 'uid': caller } c.publish('%s_%s' % ( self.tpa.id, message['user_id'] ), json.dumps(mes)) #c.publish('%s_%s' % ( self.tpa.id, message['caller'] ), json.dumps(mes)) if message['act'] == 'i_denite_to_private_chat': mes = { "act" : "pop_up_message", "message" : _('Sorry, but woman just reject your invitation.'), 'delay' : 3000} c.publish('%s_%s' % ( self.tpa.id, message['user_id'] ), json.dumps(mes)) elif message['act'] == 'invite_from_chat': opponent = ChatUser.objects.get(pk=message['uid']) if opponent.gender == 'm': # a woman invite a men if message['type'] == 'spy': logger.debug('Invitation to man from chat (spy) to uid:%s from uid:%s' % (message['uid'], message['caller'])) room = self.get_or_create_room(message['caller'],message['uid'],'spy') chanel = 'wc_%s_%s' % (message['uid'], self.tpa.id) mes = { 'act': 'show_my_cam', 'chanel': chanel } c.publish('%s_%s' % ( self.tpa.id, message['caller'] ), json.dumps(mes)) # #c.publish('%s_%s' % ( self.tpa.id, message['uid'] ), json.dumps(mes)) if message['type'] == 'common': logger.debug('Invitation to man from chat (common) to uid:%s from uid:%s' % (message['uid'], message['caller'])) room = self.get_or_create_room(message['caller'],message['uid'],'common') #mes = { 'act': 'i_invite_you_to_common_chat', 'username': self.current_user.name, 'uid': self.current_user.id } #c.publish('%s_%s' % ( self.tpa.id, message['uid'] ), json.dumps(mes)) mes = { 'act': 'put_me_in_room', 'room_id': room.id, 'uid': message['uid'] } c.publish('%s_%s' % ( self.tpa.id, message['caller'] ), json.dumps(mes)) if opponent.gender == 'w': # a man invite a woman if opponent.now_in_private == True: mes = { "act" : "apponent_is_busy" } c.publish('%s_%s' % ( self.tpa.id, message['caller'] ), json.dumps(mes)) else: if message['type'] == 'spy': logger.debug('Invitation to woman from chat (spy) to uid:%s from uid:%s' % (message['uid'], message['caller'])) mes = { 'act': 'add_video_to_slot', 'uid': message['uid'] } c.publish('%s_%s' % ( self.tpa.id, message['caller'] ), json.dumps(mes)) #c.publish('%s_%s' % ( self.tpa.id, message['uid'] ), json.dumps(mes)) if message['type'] == 'common': logger.debug('Invitation to woman from chat (common) to uid:%s from uid:%s' % (message['uid'], message['caller'])) room = self.get_or_create_room(message['caller'],message['uid'],'common') mes = { 'act': 'put_me_in_room', 'room_id': room.id, 'uid': message['uid'] } c.publish('%s_%s' % ( self.tpa.id, message['caller'] ), json.dumps(mes)) mes = { 'act': 'put_me_in_room', 'room_id': room.id, 'uid': message['uid'] } c.publish('%s_%s' % ( self.tpa.id, message['uid'] ), json.dumps(mes)) mes = { 'act': 'add_me_to_online', 'uid': message['uid'] } self.broadcast(self.participants, json.dumps(mes)) logger.debug('Adding %s to online.' % (message['uid'] )) #c.publish('%s_%s' % ( self.tpa.id, message['uid'] ), json.dumps(mes)) if message['type'] == 'private': logger.debug('Invitation to woman (uid:%s) to private chat from uid:%s' % (message['uid'], message['caller'])) room = self.get_or_create_room(message['caller'],message['uid'],'private') #mes = { 'act': 'put_me_in_room', 'room_id': room.id, 'uid': message['caller'] } #c.publish('%s_%s' % ( self.tpa.id, message['caller'] ), json.dumps(mes)) #logger.debug('Put %s in room %s' % ( self.tpa.id, message['caller'] )) #mes = { 'act': 'add_video_to_slot', 'uid': message['uid'] } #c.publish('%s_%s' % ( self.tpa.id, message['caller'] ), json.dumps(mes)) mes = { 'act': 'notify_about_private_invitation', 'room_id': room.id, 'uid': message['caller'], 'avatar': self.current_user.image, 'message': _('This user invite you to the private chat. You have 3 min to accept.'), 'user_name': self.current_user.name} c.publish('%s_%s' % ( self.tpa.id, message['uid'] ), json.dumps(mes)) mes = { 'act': 'waiting_for_accept_private_chat' } c.publish('%s_%s' % ( self.tpa.id, message['caller'] ), json.dumps(mes)) #logger.debug('Put %s in room %s' % ( self.tpa.id, message['uid'] )) mes = { 'act': 'delete_me_from_online', 'uid': message['uid'] } self.broadcast(self.participants, json.dumps(mes)) logger.debug('Deleting %s from online.' % (message['uid'] )) # Money spending... elif message['act'] == 'deduct': try: self.swith_room(message['room_id']) except: pass price = 0 for t in message['videos']: arr = t.split('_') woman = ChatUser.objects.get(pk=int(arr[1])) t = ChatTransactions() t.man = self.current_user t.woman = woman t.ammount = self.price_spy t.tpa = self.tpa t.save() if(self.current_user.gender=='m'): remoute_deduct(self.current_user,self.tpa, 'watching', woman) #import pdb; pdb.set_trace() #self.account = self.account - price user = ChatUser.objects.get(pk=self.current_user.id) if self.account<=0: mes = { "act": "empty_account"} if self.is_noticed_about_empty_account == False: c.publish(self.identifier, json.dumps(mes)) self.is_noticed_about_empty_account = True user.account = 0 user.save() #mes = { "act": "update_account", "account": '0.00'} #c.publish(self.identifier, json.dumps(mes)) else: user.account = user.account - price user.save() #mes = { "act": "update_account", "account": str(user.account)} #c.publish(self.identifier, json.dumps(mes)) self.room.duration = self.room.duration + 60 self.room.save() # Sending a message to opponent elif message['act'] == 'send_message': # Check for money if self.current_user.account == 0 and self.current_user.gender == 'm' : # Send error message couse of no money mes = { "act": "empty_account"} c.publish(self.identifier, json.dumps(mes)) return True # Set servers locale to Kiev time to save same date of message for girl and man import pytz, datetime local = pytz.utc naive = datetime.datetime.strptime (time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime()), "%Y-%m-%d %H:%M:%S") local_dt = local.localize(naive, is_dst=None) utc_dt = local_dt.astimezone (pytz.timezone ("Europe/Kiev")) # Send current message to both of interlocutors for r in message['recipients']: print "publishing to %s" % (r,) c.publish(r, json.dumps({ "timestamp" : int(time.time()), # Time of message sent in seconds "time" : utc_dt.strftime ("%H:%M:%S"), # Time that opponents see in the chat "content" : message['message'], # Message, properly "gender" : message['gender'], # Gender of user who sent message "uid" : message['uid'], # ID of user who sent message "name" : message['name'], # Name of user who sent message "room_id" : message['room_id'], # Current room id "act" : "send_message" })) # Change current room if message sent to opponent in another room #import pdb; pdb.set_trace() self.swith_room(message['room_id']) # Save message to database in the backend of Tornado server message = save_chat_message.delay(self.current_user, message['message'], self.tpa, self.room) make_room_as_charging(self.room)
# If he is not exist - FAIL CONNECTION except Exception, e: logger.debug(e) return False # Get Tpa object from ChatUser object tpa = user.tpa # Set user is online and save the rest information we will need try: user.is_online = 1 user.save() self.profile = user self.is_auth = 'true' set_user_online(user, tpa) except Exception, e: self.is_auth = 'false' logger.debug(e) return False self.current_user = user self.tpa = tpa self.account = user.account self.price_common = tpa.price_common self.price_private = tpa.price_private self.price_spy = tpa.price_spy self.identifier = '%s_%s' % ( tpa.id, user.id )