Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mrDoctorWho/vk4xmpp.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormrDoctorWho <mrdoctorwho@gmail.com>2015-01-18 17:46:41 +0300
committermrDoctorWho <mrdoctorwho@gmail.com>2015-01-18 17:46:41 +0300
commit33e9860e3d9b82ca38783193bda17c614a86bf8a (patch)
tree096748b0989445c78d1e8f20d06d065abb32c164
parent553b9271015f8fa018e9f905fc0b291656941a0c (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.py29
-rw-r--r--gateway.py16
-rw-r--r--library/vkapi.py1
-rw-r--r--modules/mod_iq_disco.py27
-rw-r--r--modules/mod_prs_main.py2
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)
diff --git a/gateway.py b/gateway.py
index 15ec11b..ab6e64c 100644
--- a/gateway.py
+++ b/gateway.py
@@ -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]