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)) }