2014-05-18 1 views
1

아마추어 문제에 사과하십시오. 나는 Python을 배우는 중이고 XMPP를 사용하여이 XMPP 봇 스크립트를 뒤범벅하고 있습니다. http://sleekxmpp.com/getting_started/muc.html 내 봇의 예에서 다른SleekXMPP의 메시지로 "역할"및/또는 "소속"을받습니다.

내 스크립트 SQLite 데이터베이스를 만들고 각 group_message 이벤트, 닉과를 검색하기 위해 XML을 구문 분석이다 :

나는 봇은 SleekXMPP에서 MUC 봇 예제를 사용하여 구축 메시지 본문 텍스트를 만들고 타임 스탬프를 사용하여 데이터베이스에 씁니다. 인쇄 문 그래서 메시지가 내가 아는 터미널 그렇게하여 체크 볼 수 있습니다 디버깅을 위해 단지이다

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 채널에서 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

역할은/제휴가 포함되지 않은 메시지에있어서, 상기 대화 상태의 일부이다. <message>, 당신은 예를 들어했다 <iq>, 검색하거나 사물의 존재를 나타내는, 사물과 <presence>을 설정하는 데 사용됩니다 말씀 드리지만

는 XMPP 보내 얻을 세 가지 다른 스탠자가 있습니다. 역할/제휴 정보는 현재 스탠자에 포함됩니다. 예를 들어, 클라이언트가 방안에있는 사람을 이미 알기 위해받은 첫 번째 스탠 자에서 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에서 탈퇴 이벤트 트리거가있어 dict 항목을 삭제하는 데 사용할 수 있는지 또는 탈퇴 메시지를 수동으로 감지하도록 설정해야합니까? – HittingSmoke