diff options
author | mrDoctorWho <mrdoctorwho@gmail.com> | 2015-01-18 17:46:41 +0300 |
---|---|---|
committer | mrDoctorWho <mrdoctorwho@gmail.com> | 2015-01-18 17:46:41 +0300 |
commit | 33e9860e3d9b82ca38783193bda17c614a86bf8a (patch) | |
tree | 096748b0989445c78d1e8f20d06d065abb32c164 | |
parent | 553b9271015f8fa018e9f905fc0b291656941a0c (diff) |
Finished global transport settings feature
Added feature "send all unavailable presences" in the global transport settings
Added "Show all users (not only active ones)" in the user settings
-rw-r--r-- | extensions/groupchats.py | 29 | ||||
-rw-r--r-- | gateway.py | 16 | ||||
-rw-r--r-- | library/vkapi.py | 1 | ||||
-rw-r--r-- | modules/mod_iq_disco.py | 27 | ||||
-rw-r--r-- | modules/mod_prs_main.py | 2 |
5 files changed, 50 insertions, 25 deletions
diff --git a/extensions/groupchats.py b/extensions/groupchats.py index b634493..3482704 100644 --- a/extensions/groupchats.py +++ b/extensions/groupchats.py @@ -12,6 +12,7 @@ try: except ImportError: mod_xhtml = None + def sendIQ(chat, attr, data, afrls, role, jidFrom, cb=None, args={}): stanza = xmpp.Iq("set", to=chat, frm=jidFrom) query = xmpp.Node("query", {"xmlns": xmpp.NS_MUC_ADMIN}) @@ -121,7 +122,6 @@ class Chat(object): joinChat(self.jid, name, TransportID) ## we're joining to chat with the room owner's name to set the topic. That's why we have so many lines of code right here self.setConfig(self.jid, TransportID, False, self.onConfigSet, {"user": user}) ## executehandler? - ## TODO: Return chat object from the message def initialize(self, user, chat): """ Initializes chat object: @@ -158,11 +158,11 @@ class Chat(object): Uses two users list to prevent losing anyone """ users = vkChat["chat_active"].split(",") or [] - users_new = self.getVKChat(userObject, self.id) - if users_new: - users_new = users_new[0].get("users", []) - ## list of all users. We could miss some of them in vkChat or in users_new. - all_users = set([int(x) for x in (list(users) + list(users_new))]) + all_users = users + if userObject.settings.show_all_chat_users: + users = self.getVKChat(userObject, self.id) + if users: + all_users = users[0].get("users", []) for user in all_users: ## checking if there new users we didn't join yet @@ -189,13 +189,6 @@ class Chat(object): self.topic = topic self.raw_users = all_users - def getVKChat(self, user, id): - """ - Searches the chat by id - """ - chats = user.vk.method("execute.getChats") - return filter(lambda dict: dict.get("chat_id") == id, chats) or [] - @classmethod def setConfig(cls, chat, jidFrom, exterminate=False, cb=None, args={}): """ @@ -226,6 +219,13 @@ class Chat(object): logger.error("groupchats: couldn't set room %s config (jid: %s)" % (chat, user.source)) @classmethod + def getVKChat(cls, user, id): + """ + Searches the chat by id + """ + return user.vk.method("messages.getChat") or [] + + @classmethod def getParts(cls, source): """ Split the source and returns required parts @@ -316,7 +316,7 @@ def handleChatErrors(source, prs): def exterminateChat(user): """ - Calls a Dalek to exterminate the chat + Calls a Dalek for exterminate the chat """ chats = user.vk.method("execute.getChats") for chat in chats: @@ -324,6 +324,7 @@ def exterminateChat(user): if ConferenceServer: + GLOBAL_USER_SETTINGS["show_all_chat_users"] = {"label": "Show all chat users (only active ones by default)", "value": 0} logger.info("extension groupchats is loaded") TransportFeatures.append(xmpp.NS_GROUPCHAT) registerHandler("msg01", outgoingChatMessageHandler) @@ -82,7 +82,8 @@ STANZA_SEND_INTERVAL = 0.03125 VK_ACCESS = 69638 GLOBAL_USER_SETTINGS = {"groupchats": {"label": "Handle groupchats", "value": 1}, "keep_onlne": {"label": "Keep my status online", "value": 1}} -GLOBAL_TRANSPORT_SETTINGS = {} # globals(), lol +TRANSPORT_SETTINGS = {"send_unavailable": {"label": "Send unavailable from "\ + "friends when user log off", "value": 0}} pidFile = "pidFile.txt" @@ -292,7 +293,7 @@ class Settings(object): if user: self.settings = deepcopy(GLOBAL_USER_SETTINGS) else: - self.settings = GLOBAL_TRANSPORT_SETTINGS + self.settings = TRANSPORT_SETTINGS self.settings.update(eval(rFile(self.filename))) ## better use json.load() instead self.keys = self.settings.keys self.items = self.settings.items @@ -702,15 +703,20 @@ class User(object): sendPresence(self.source, vk2xmpp(uid), None, value["name"], caps=True) sendPresence(self.source, TransportID, None, IDENTIFIER["name"], caps=True) - def sendOutPresence(self, destination, reason=None): + def sendOutPresence(self, destination, reason=None, all=False): """ Sends out presence (unavailable) to destination and set reason if exists Parameters: destination: to whom send the stanzas reason: offline status message + all: send an unavailable from all friends or only the ones who's online """ logger.debug("User: sending out presence to %s" % self.source) - for uid in self.friends.keys() + [TransportID]: + friends = self.friends.keys() + if not all and friends: + friends = filter(lambda key: self.friends[key]["online"], friends) + + for uid in friends + [TransportID]: sendPresence(destination, vk2xmpp(uid), "unavailable", reason=reason) def sendSubPresence(self, dist=None): @@ -1324,7 +1330,7 @@ def exit(signal=None, frame=None): status = "Shutting down by %s" % ("SIGTERM" if signal == 15 else "SIGINT") Print("#! %s" % status, False) for user in Transport.itervalues(): - user.sendOutPresence(user.source, status) + user.sendOutPresence(user.source, status, all=True) Print("." * len(user.friends), False) Print("\n") executeHandlers("evt02") diff --git a/library/vkapi.py b/library/vkapi.py index 3b2b713..cea4ec7 100644 --- a/library/vkapi.py +++ b/library/vkapi.py @@ -32,7 +32,6 @@ except ImportError: logger.error("vkapi: ujson couldn't be loaded, using simplejson instead") - def attemptTo(maxRetries, resultType, *errors): """ Tries to execute function ignoring specified errors specified number of diff --git a/modules/mod_iq_disco.py b/modules/mod_iq_disco.py index e9a482a..123b34d 100644 --- a/modules/mod_iq_disco.py +++ b/modules/mod_iq_disco.py @@ -5,7 +5,7 @@ from __main__ import * -NODES = {"admin": ("Delete users", "Global message", "Show crashlogs", "Reload config"), "user": ("Edit settings",)} +NODES = {"admin": ("Delete users", "Global message", "Show crashlogs", "Reload config", "Global Transport settings"), "user": ("Edit settings",)} def disco_handler(cl, iq): source = iq.getFrom().getStripped() @@ -53,9 +53,9 @@ def disco_handler(cl, iq): elif node == xmpp.NS_COMMANDS: if source == evalJID: for node in NODES["admin"]: - payload.append(xmpp.Node("item", {"node": node, "name": node, "jid": TransportID })) + payload.append(xmpp.Node("item", {"node": node, "name": node, "jid": TransportID})) for node in NODES["user"]: - payload.append(xmpp.Node("item", {"node": node, "name": node, "jid": TransportID })) + payload.append(xmpp.Node("item", {"node": node, "name": node, "jid": TransportID})) result.setQueryPayload(payload) else: @@ -70,6 +70,7 @@ def getUsersList(): result = db.fetchall() return result + def deleteUsers(jids): for key in jids: try: @@ -77,6 +78,7 @@ def deleteUsers(jids): except Exception: pass + def sendGlobalMessage(text): jids = getUsersList() for jid in jids: @@ -143,17 +145,33 @@ def commands_handler(cl, iq): ) commandTag.addChild(node=form) completed = True + elif node == "Reload config": try: execfile(Config, globals()) except Exception: - commandTag = result.setTag("command", {"status": "executing", "node": node, "sessionid": sessionid}, xmpp.NS_COMMANDS) +## commandTag = result.setTag("command", {"status": "executing", "node": node, "sessionid": sessionid}, xmpp.NS_COMMANDS) form = utils.buildDataForm(None, None, [{"var": "FORM_TYPE", "type": "hidden", "value": xmpp.NS_ADMIN}, {"var": "body", "type": "text-multi", "label": "Error while loading the config file", "value": wException()}]) commandTag.addChild(node=form) completed = True + elif node == "Global Transport settings": + config = transportSettings.settings + if not form: + form_fields = [{"var": "FORM_TYPE", "type": "hidden"}] + for key, values in config.items(): + form_fields.append({"var": key, "label": values["label"], "type": values.get("type", "boolean"), "value": values["value"]}) ## todo: Add support for list-multi and others? + + form = utils.buildDataForm(None, None, form_fields, "Choose wisely") + commandTag.addChild(node=form) + elif form and source in Transport: + form = xmpp.DataForm(node=form).asDict() + for key in form.keys(): + if key in config.keys(): + transportSettings.settings[key] = utils.normalizeValue(form[key]) + completed = True if node == "Edit settings" and source in Transport: logger.info("user want to edit his settings (jid: %s)" % source) @@ -179,7 +197,6 @@ def commands_handler(cl, iq): sender(cl, result) - def load(): Component.RegisterHandler("iq", disco_handler, "get", xmpp.NS_DISCO_INFO) Component.RegisterHandler("iq", disco_handler, "get", xmpp.NS_DISCO_ITEMS) diff --git a/modules/mod_prs_main.py b/modules/mod_prs_main.py index f4f7def..1862190 100644 --- a/modules/mod_prs_main.py +++ b/modules/mod_prs_main.py @@ -52,6 +52,8 @@ def presence_handler(cl, prs): user.sendOutPresence(jidFrom) if not user.resources: sender(cl, xmpp.Presence(jidFrom, "unavailable", frm = TransportID)) + if transportSettings.send_unavailable: + user.sendOutPresence(jidFrom) user.vk.disconnect() try: del Transport[source] |