diff src/plugins/plugin_misc_account.py @ 1726:2ebe66a96d05

plugin misc_account: auto add some contacts at profile creation
author souliane <souliane@mailoo.org>
date Mon, 07 Dec 2015 20:35:21 +0100
parents c1be6363bfab
children 68e498b3367e
line wrap: on
line diff
--- a/src/plugins/plugin_misc_account.py	Mon Dec 07 19:56:12 2015 +0100
+++ b/src/plugins/plugin_misc_account.py	Mon Dec 07 20:35:21 2015 +0100
@@ -27,6 +27,7 @@
 from sat.core.constants import Const as C
 
 from twisted.internet import reactor, defer, protocol
+from twisted.words.protocols.jabber import jid
 from twisted.python.procutils import which
 from twisted.python.failure import Failure
 from twisted.mail.smtp import sendmail
@@ -61,7 +62,8 @@
                 "new_account_domain": "example.net",
                 "prosody_path": None, # prosody path (where prosodyctl will be executed from), or None to automaticaly find it
                 "prosodyctl": "prosodyctl",
-                "reserved_list": ['libervia'] # profiles which can't be used
+                "reserved_list": ['libervia'], # profiles which can't be used
+                "auto_add_contacts": ['salut-a-toi@libervia.org'],
                }
 
 
@@ -168,7 +170,9 @@
         return ''.join([random.choice(charset) for i in range(15)])
 
     def _registerAccount(self, email, password, profile):
-        return self.registerAccount(email, password, None, profile)
+        d = self.registerAccount(email, password, None, profile)
+        d.addCallback(lambda dummy: self.autoAddContacts(password, profile))
+        return d
 
     def registerAccount(self, email, password, jid_s, profile):
         """Register a new profile and its associated XMPP account.
@@ -227,6 +231,29 @@
         d.addErrback(removeProfile)
         return d
 
+    def autoAddContacts(self, password, profile):
+        """Auto-add some roster contacts after the profile creation.
+        
+        @param password (unicode): XMPP account password
+        """
+        contacts = self.getConfig('auto_add_contacts')
+        if not contacts:
+            return
+
+        def addContact(was_connected, contacts):
+            for contact in contacts:
+                d = self.host.addContact(contact, profile)
+            if not was_connected:
+                d.addCallback(lambda dummy: self.host.disconnect(profile))
+
+        try:
+            contacts_jid = [jid.JID(contact) for contact in contacts]
+        except (RuntimeError, jid.InvalidFormat, AttributeError):
+            log.error("Invalid JIDs list: %s" % ", ".join(contacts))
+        else:
+            d = self.host.asyncConnect(profile, password, max_retries=0)
+            d.addCallback(addContact, contacts_jid)
+
     def sendEmails(self, email, jid_s, password, profile):
         # time to send the email
 
@@ -548,5 +575,6 @@
             self.host.memory.asyncDeleteProfile(jid_s)
             raise failure
 
+        d.addCallback(self.autoAddContacts(password, jid_s))
         d.addErrback(removeProfile)
         return d