Dienstag, 22. Oktober 2013

Rudimentärer Facebook Chat Client

Hinweis: Seit der Veröffentlichung der Facebook API 2.0 im April 2014 ist die Chatfunktion deaktiviert, und damit leider dieser Code nicht mehr lauffähig.

Heute möchte ich die vorigen Posts kombinieren und einen rudimentären Client für den Facebook Chat vorstellen.
Beim Laden des Formulars wird die Verbindung hergestellt und alle Freunde aus der Kontaktliste in dem Dictionary Friends gespeichert. Zusätzlich wird für jeden ein MessageCallback angelegt, sodass jegliche ankommenden Nachrichten empfangen werden.
Ist dieser Vorgang abgeschlossen, wird das Formular angezeigt.
Es enthält 2 Textboxes und einen Button. In der textBox1 kann der Empfänger angegeben werden, in der textBox2 der Nachrichtentext. Per Klick auf den Button wird die Nachricht dann gesendet. Eingehende Nachrichten werden jeweils mit einer MessageBox angezeigt.
Als Empfänger muss der vollständige Facebook Name angegeben werden, das heißt so, wie dieser bei Facebook zum Beispiel in der Chat Leiste angezeigt wird.
Das Programm wandelt diesen Namen dann mit dem Dictionary Friends in die entsprechende Jid um, bei eingehenden Nachrichten die Jid in den Namen.

Da alle Code Teile aus den vorigen Posts bekannt sind, hier direkt der Code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using agsXMPP;
using agsXMPP.protocol.client;
using agsXMPP.protocol.iq.roster;
using agsXMPP.Collections;

using System.Net;
using System.IO;
using Newtonsoft.Json.Linq;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        XmppClientConnection xmpp = new XmppClientConnection("chat.facebook.com");
        Dictionary<string, string> Friends = new Dictionary<string, string>();
        bool StartCollectingContacts = false;
        bool CollectingContacts = true;

        private void Form1_Load(object sender, EventArgs e)
        {
            xmpp.OnLogin += new ObjectHandler(OnLogin);
            xmpp.Open("name", "password");

            while (CollectingContacts)
            {
                if (StartCollectingContacts)
                    CollectingContacts = false;
                System.Threading.Thread.Sleep(1000);
            }
        }

        private void OnLogin(object sender)
        {
            Presence p = new Presence(ShowType.chat, "Online");
            p.Type = PresenceType.available;
            xmpp.Send(p);
            xmpp.OnRosterItem += new XmppClientConnection.RosterHandler(xmpp_OnRosterItem);
        }

        private void xmpp_OnRosterItem(object sender, agsXMPP.protocol.iq.roster.RosterItem item)
        {
            try
            {
                StartCollectingContacts = true;
                CollectingContacts = true;
                Friends.Add(item.GetAttribute("jid").ToString(), item.GetAttribute("name").ToString());
                xmpp.MessageGrabber.Add(new Jid(item.GetAttribute("jid").ToString()), new BareJidComparer(), new MessageCB(MessageCallBack), null);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        private void MessageCallBack(object sender, agsXMPP.protocol.client.Message msg, object data)
        {
            if (msg.Body != null)
            {
                MessageBox.Show(Friends[msg.From.ToString()] + ": " + msg.Body);
            }
        }

        public void SendMessage(string msg, string receiverName) {
            xmpp.Send(new agsXMPP.protocol.client.Message(new Jid(receiverName), agsXMPP.protocol.client.MessageType.chat, msg));
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string ReceiverId = Friends.First(x => x.Value == textBox1.Text).Key;
            SendMessage(textBox2.Text, ReceiverId);
        }

    }
}

Keine Kommentare:

Kommentar veröffentlichen