2014-05-18 61 views
1

業餘問題的道歉。我只是在學習Python,而我正在使用XMPP來解決這個XMPP機器人腳本。 http://sleekxmpp.com/getting_started/muc.html在SleekXMPP中收到「角色」和/或「隸屬關係」消息

在哪裏我的機器人從例如不同的是我的腳本創建一個SQLite數據庫和每個group_message事件,解析XML來檢索尼克和:

我有一個機器人利用SleekXMPP的MUC BOT例如建消息正文文本並用時間戳寫入數據庫。

這裏是我的機器人的那的錄音從XMPP通道輸出味精各部分:

def groupchat_message(self, msg): 
    if msg['type'] in ('groupchat'): 
     raw = str(msg) # Save raw XML as a string in the database for debugging purposes 
     timestamp = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S') 
     fromuser = str(msg['from']) # Convert "from" attribute to string so it can be split 
     author = fromuser.split('/')[1] # Split "from" attribute to remove channel address leaving only nick behind 
     body = msg['body'] 

     msginsert = [timestamp, author, body, raw] # Database input list to be handed to placeholders. 

     db.execute("INSERT INTO messages VALUES (?,?,?,?)", msginsert) # "?" placeholder is REQUIRED for automatic database sanitization. 
     dbconn.commit() 

     print("[",timestamp,"]",author,": ",body, sep='') 
    else: 
     print(msg) 

打印語句只是爲了調試的目的,所以我可以觀察消息在終端蜱通過,所以我知道該腳本正在運行。

在錄製的信息中,我希望在XMPP頻道中包含用戶的角色或聯盟,以便管理員和版主可以被挑選出來。這是我無法包裹頭部的麻煩。看起來我應該可以根據SleekXMPP stanza docs來做到這一點,但我無法弄清楚我如何從消息XML獲得角色/聯盟信息。

如何獲取消息XML中提供的信息並獲取發佈該消息的用戶的角色和/或隸屬關係?

作爲參考,這是來自XMPP通道XML輸出爲消息的原始:

<message to="[email protected]" from="[email protected]/User Nick" id="1453" type="groupchat"> 
    <body>This is the message body text</body> 
    <x xmlns="jabber:x:event"> 
     <composing /> 
    </x> 
</message> 

回答

1

的作用/不包含從屬關係在該消息中,它是聊天的狀態的一部分。

作爲提醒,XMPP有獲得三個不同的節:<message>,你有作爲一個例子,<iq>,這是用來檢索或設置的東西,<presence>,這表明事物的存在。角色/聯盟信息包含在現場節中。例如,在您的客戶收到的第一個存在段中通知其已經在房間中的人,請參閱Example 21 from XEP-0045 (Multi-User Chat)。當某人的暱稱,角色或聯繫發生變化或他們離開房間時,您的客戶還會收到新的狀態欄。

你應該確保自己存儲這些信息,因爲SleekXMPP不會爲你做。這可以通過創建一個字典來完成,該字典爲每個暱稱存儲他們的角色,併爲他們的聯盟存儲一個暱稱。在出現更改時,應確保更新此信息。然後,您可以在消息處理程序中使用這些字典來記錄他們的角色/聯繫。

因此,像:

def __init__(...): 
    self.roles = dict() 
    self.affiliations = dict() 
    self.add_event_handler(""groupchat_presence"", self.muc_presence) 

... 

def muc_presence(self, presence): 
    nick = presence['muc']['nick'] 

    self.roles[nick] = presence['muc']['role'] 
    self.affiliations[nick] = presence['muc']['affiliation'] 

這是一般的想法,你需要做更多的工作,使其處理綽號的變化和人們離開房間正常。

+0

尼克變化不是一個問題,因爲他們不允許在這臺服務器上。通過處理用戶退出,你的意思是從字典中刪除信息?我很確定我知道該怎麼做。 – HittingSmoke

+1

是的。嚴格地說,沒有必要刪除它們(因爲它們會在發送消息之前再次加入),但是如果沒有,你會浪費記憶。 – xnyhps

+0

太棒了,謝謝。我得到了角色和聯盟記錄所有設置和它的工作。你知道在Sleek中是否有離開事件觸發器,我可以用它來刪除字典條目,或者我必須手動設置它來檢測離開消息嗎? – HittingSmoke

相關問題