diff --git a/xmpp.go b/xmpp.go
index ed69756..b896eb0 100644
--- a/xmpp.go
+++ b/xmpp.go
@@ -614,6 +614,10 @@ func (c *Client) SendOrg(org string) (n int, err error) {
return fmt.Fprint(c.conn, org)
}
+func (c *Client) SendPresence(presence Presence) (n int, err error) {
+ return fmt.Fprintf(c.conn, "", xmlEscape(presence.From), xmlEscape(presence.To))
+}
+
// SendHtml sends the message as HTML as defined by XEP-0071
func (c *Client) SendHtml(chat Chat) (n int, err error) {
return fmt.Fprintf(c.conn, ""+
diff --git a/xmpp_muc.go b/xmpp_muc.go
index eeb1c89..f88f1b6 100644
--- a/xmpp_muc.go
+++ b/xmpp_muc.go
@@ -9,39 +9,126 @@ package xmpp
import (
"fmt"
+ "time"
+ "errors"
)
const (
nsMUC = "http://jabber.org/protocol/muc"
nsMUCUser = "http://jabber.org/protocol/muc#user"
+ NoHistory = 0
+ CharHistory = 1
+ StanzaHistory = 2
+ SecondsHistory = 3
+ SinceHistory = 4
)
-// xep-0045 7.2
-func (c *Client) JoinMUC(jid, nick string) {
+// Send sends room topic wrapped inside an XMPP message stanza body.
+func (c *Client) SendTopic(chat Chat) (n int, err error) {
+ return fmt.Fprintf(c.conn, ""+"%s",
+ xmlEscape(chat.Remote), xmlEscape(chat.Type), xmlEscape(chat.Text))
+}
+
+func (c *Client) JoinMUCNoHistory(jid, nick string) (n int, err error) {
if nick == "" {
nick = c.jid
}
- fmt.Fprintf(c.conn, "\n"+
- "\n"+
+ return fmt.Fprintf(c.conn, "\n"+
+ ""+
+ "\n"+
"",
xmlEscape(jid), xmlEscape(nick), nsMUC)
}
-// xep-0045 7.2.6
-func (c *Client) JoinProtectedMUC(jid, nick string, password string) {
+// xep-0045 7.2
+func (c *Client) JoinMUC(jid, nick string, history_type, history int, history_date *time.Time) (n int, err error) {
if nick == "" {
nick = c.jid
}
- fmt.Fprintf(c.conn, "\n"+
- "\n"+
- "%s\n"+
- "\n"+
- "",
- xmlEscape(jid), xmlEscape(nick), nsMUC, xmlEscape(password))
+ switch history_type {
+ case NoHistory:
+ return fmt.Fprintf(c.conn, "\n" +
+ "\n" +
+ "",
+ xmlEscape(jid), xmlEscape(nick), nsMUC)
+ case CharHistory:
+ return fmt.Fprintf(c.conn, "\n" +
+ "\n" +
+ "\n"+
+ "",
+ xmlEscape(jid), xmlEscape(nick), nsMUC, history)
+ case StanzaHistory:
+ return fmt.Fprintf(c.conn, "\n" +
+ "\n" +
+ "\n"+
+ "",
+ xmlEscape(jid), xmlEscape(nick), nsMUC, history)
+ case SecondsHistory:
+ return fmt.Fprintf(c.conn, "\n" +
+ "\n" +
+ "\n"+
+ "",
+ xmlEscape(jid), xmlEscape(nick), nsMUC, history)
+ case SinceHistory:
+ if history_date != nil {
+ return fmt.Fprintf(c.conn, "\n" +
+ "\n" +
+ "\n" +
+ "",
+ xmlEscape(jid), xmlEscape(nick), nsMUC, history_date.Format(time.RFC3339))
+ }
+ }
+ return 0, errors.New("Unknown history option")
+}
+
+// xep-0045 7.2.6
+func (c *Client) JoinProtectedMUC(jid, nick string, password string, history_type, history int, history_date *time.Time) (n int, err error) {
+ if nick == "" {
+ nick = c.jid
+ }
+ switch history_type {
+ case NoHistory:
+ return fmt.Fprintf(c.conn, "\n" +
+ "\n" +
+ "%s\n"+
+ "",
+ xmlEscape(jid), xmlEscape(nick), nsMUC, xmlEscape(password))
+ case CharHistory:
+ return fmt.Fprintf(c.conn, "\n" +
+ "\n" +
+ "%s\n"+
+ "\n"+
+ "",
+ xmlEscape(jid), xmlEscape(nick), nsMUC, xmlEscape(password), history)
+ case StanzaHistory:
+ return fmt.Fprintf(c.conn, "\n" +
+ "\n" +
+ "%s\n"+
+ "\n"+
+ "",
+ xmlEscape(jid), xmlEscape(nick), nsMUC, xmlEscape(password), history)
+ case SecondsHistory:
+ return fmt.Fprintf(c.conn, "\n" +
+ "\n" +
+ "%s\n"+
+ "\n"+
+ "",
+ xmlEscape(jid), xmlEscape(nick), nsMUC, xmlEscape(password), history)
+ case SinceHistory:
+ if history_date != nil {
+ return fmt.Fprintf(c.conn, "\n" +
+ "\n" +
+ "%s\n"+
+ "\n" +
+ "",
+ xmlEscape(jid), xmlEscape(nick), nsMUC, xmlEscape(password), history_date.Format(time.RFC3339))
+ }
+ }
+ return 0, errors.New("Unknown history option")
}
// xep-0045 7.14
-func (c *Client) LeaveMUC(jid string) {
- fmt.Fprintf(c.conn, "",
+func (c *Client) LeaveMUC(jid string) (n int, err error) {
+ return fmt.Fprintf(c.conn, "",
c.jid, xmlEscape(jid))
}