def add_roster_by_jid(self, jid1, jid2): """ 将jid2加入到jid1的roster好友列表里面 注意仅仅单方面添加好友 :param jid1: JID1 :param jid2: JID2 :return: """ url = "plugins/userService/users/%s/roster" % JidMgr().gen_user_name( jid1) header = { "Authorization": self.Authorization, "Content-Type": "application/xml" } body = """<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <rosterItem> <jid>%s</jid> <nickname>%s</nickname> <subscriptionType>3</subscriptionType> <groups> <group>Friends</group> </groups> </rosterItem>"""\ %(jid2, JidMgr().gen_user_name(jid2)) return self.user_http.fetch_async(url, header, body)
def is_jid_in_roster(self, jid): """ 判断某个jid是否在roster中 :param jid: jid :return:True/False """ if not self.xmpp_client.roster_client.roster: return False for item in self.xmpp_client.roster_client.roster.items(): if JidMgr().get_jid_str(item.jid) == JidMgr().get_jid_str(jid): return True return False
def is_friend(self, user_name1, user_name2): """ 根据好友roster判断两个用户是否是好友 :param user_name1: :param user_name2: :return: """ user1_roster = self.get_roster(user_name1).get('roster', {}) if not user1_roster: return False roster_items = user1_roster.get("rosterItem", {}) # rosterItem:1个元素的时候是OrderedDict;多个元素的时候是list if not isinstance(roster_items, list): roster_items = [roster_items] is_friend = False for roster_item in roster_items: if int(roster_item['subscriptionType'] ) != SUB_TP_FRIEND_EACH_OTHER: continue if JidMgr().gen_user_name(roster_item['jid']) == user_name2: is_friend = True break return is_friend
def add_roster(self, user_name1, user_name2): """ 将user_name2加入到user_name1的roster好友列表里面 注意仅仅单方面添加好友 :param user_name1: 用户1 :param user_name2: 用户2 :return: """ url = "plugins/userService/users/%s/roster" % user_name1 header = { "Authorization": self.Authorization, "Content-Type": "application/xml" } body = """<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <rosterItem> <jid>%s</jid> <nickname>%s</nickname> <subscriptionType>3</subscriptionType> <groups> <group>Friends</group> </groups> </rosterItem>"""\ %(JidMgr().gen_jid(user_name2, self.openfire_ip), user_name2) return self.user_http.fetch_async(url, header, body)
class UserService(object): __metaclass__ = Singleton Authorization = "qOAWYYau" def __init__(self, openfire_ip=None, openfire_port=None): assert openfire_ip assert openfire_port self.openfire_ip = openfire_ip self.openfire_port = openfire_port self.user_http = HttpRpcClient(self.openfire_ip, self.openfire_port) @except_adaptor() def add_user(self, user_name, password): url = "plugins/userService/users" header = { "Authorization": self.Authorization, "Content-Type": "application/xml" } body = """<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <user> <username>%s</username> <password>%s</password> </user>""" % (user_name, password) return self.user_http.fetch_async(url, header, body) @except_adaptor() def del_user(self, user_name): url = "plugins/userService/users/%s" % user_name header = {"Authorization": self.Authorization} return self.user_http.fetch_async(url, header, method="DELETE") @except_adaptor() def new_jid(self, user_name, password): """ 生产jid :param user_name:用户名 :param password:密码 :return:{"jid": new_jid, "password": password} """ try: self.add_user(user_name, password) except HTTPError, e: error_reason = xmltodict.parse(e.read()) if error_reason.get('error', {}).get('exception', None) == UserAlreadyExistException: logger.warn( "RegisterHandle new_jid failed!!!, jid for user_name:%s, password:%s has exist!!" % (user_name, password)) # 由于默认user_name就是jid的user_name,所以不能出现user_name不存在,但是jid存在的情况 # 但是由于是测试阶段,有可能手动添加JID,所以暂时忽略这种bug # assert False, error_reason new_jid = JidMgr().gen_jid(user_name, self.openfire_ip) return {"jid": new_jid, "password": password}
def is_jid(jid): """ extend utils function "is_jid" for unsafe input :param jid :return: """ if not isinstance(jid, basestring) or len(jid.split('@')) != 2: return False else: return JidMgr.is_jid(jid)
def del_roster(self, user_name, del_jid): """ 将del_jid从user_name的roster好友列表里面移除, 注意仅仅单方面删除好友 :param user_name: 用户 :param del_jid: 删除的jid :return: """ del_jid_str = JidMgr().get_jid_str(del_jid) del_jid_str = urllib.quote(del_jid_str) url = "plugins/userService/users/%s/roster/%s" % (user_name, del_jid_str) header = {"Authorization": self.Authorization} return self.user_http.fetch_async(url, header, method="DELETE")
def parse_ros_dic(ros_dic, name=False): """ parse roster dictionary(collection.OrderedDict) to name_list or jid_list due to param:name :param ros_dic: :param name: :return: """ jid_list = list() name_list = list() if ros_dic.get('roster', None): roster_item = ros_dic['roster']['rosterItem'] if isinstance(roster_item, list): for item in roster_item: jid_list.append(item['jid']) else: jid_list.append(roster_item['jid']) if not name: return jid_list else: for jid in jid_list: name_list.append(JidMgr.gen_user_name(jid)) return name_list