java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/chat/MistnostPripojena.java
author František Kučera <franta-hg@frantovo.cz>
Wed Jun 30 00:26:14 2010 +0200 (2010-06-30)
changeset 149 8238cdb4113a
permissions -rw-r--r--
XMPP chat – první verze.
franta-hg@149
     1
package cz.frantovo.nekurak.chat;
franta-hg@149
     2
franta-hg@149
     3
import cz.frantovo.nekurak.dto.ZpravaChatu;
franta-hg@149
     4
import java.util.ArrayList;
franta-hg@149
     5
import java.util.Collection;
franta-hg@149
     6
import java.util.LinkedList;
franta-hg@149
     7
import org.jivesoftware.smack.PacketListener;
franta-hg@149
     8
import org.jivesoftware.smack.XMPPException;
franta-hg@149
     9
import org.jivesoftware.smack.packet.Message;
franta-hg@149
    10
import org.jivesoftware.smack.packet.Packet;
franta-hg@149
    11
import org.jivesoftware.smack.util.StringUtils;
franta-hg@149
    12
import org.jivesoftware.smackx.muc.MultiUserChat;
franta-hg@149
    13
franta-hg@149
    14
/**
franta-hg@149
    15
 *
franta-hg@149
    16
 * @author fiki
franta-hg@149
    17
 */
franta-hg@149
    18
public class MistnostPripojena implements PacketListener {
franta-hg@149
    19
franta-hg@149
    20
	private final MultiUserChat muc;
franta-hg@149
    21
	private final Mistnost nastaveni;
franta-hg@149
    22
	private final LinkedList<ZpravaChatu> fronta = new LinkedList<ZpravaChatu>();
franta-hg@149
    23
	private final String mojePrezdivka;
franta-hg@149
    24
	/** Zatím nejvyšší pořadové číslo – poradoveCislo. */
franta-hg@149
    25
	private int pocitadloZprav = 0;
franta-hg@149
    26
franta-hg@149
    27
	public MistnostPripojena(Mistnost mistnost, Spojeni spojeni) throws XMPPException {
franta-hg@149
    28
		nastaveni = mistnost;
franta-hg@149
    29
		mojePrezdivka = mistnost.getPrezdivka();
franta-hg@149
    30
		muc = new MultiUserChat(spojeni.getSpojeni(), mistnost.getMuc());
franta-hg@149
    31
		muc.join(mistnost.getPrezdivka());
franta-hg@149
    32
franta-hg@149
    33
		if (mistnost.getUvitaciZprava() != null) {
franta-hg@149
    34
			muc.sendMessage(mistnost.getUvitaciZprava());
franta-hg@149
    35
		}
franta-hg@149
    36
franta-hg@149
    37
		muc.addMessageListener(this);
franta-hg@149
    38
	}
franta-hg@149
    39
franta-hg@149
    40
	public void processPacket(Packet packet) {
franta-hg@149
    41
		if (packet instanceof Message) {
franta-hg@149
    42
			Message m = (Message) packet;
franta-hg@149
    43
			String od = StringUtils.parseResource(m.getFrom());
franta-hg@149
    44
			String text = m.getBody();
franta-hg@149
    45
franta-hg@149
    46
			/** Vydolujeme jméno z anonymně (námi) poslaných zpráv */
franta-hg@149
    47
			boolean overenyUzivatel = true;
franta-hg@149
    48
			if (mojePrezdivka.equals(od) && text.contains(":")) {
franta-hg@149
    49
				od = text.split(":")[0];
franta-hg@149
    50
				text = text.substring(od.length() + 2);
franta-hg@149
    51
				overenyUzivatel = false;
franta-hg@149
    52
			}
franta-hg@149
    53
franta-hg@149
    54
			/** Přidáme zprávu do fronty historie. */
franta-hg@149
    55
			ZpravaChatu z = new ZpravaChatu(od, text, overenyUzivatel, dalsiPoradoveCislo());
franta-hg@149
    56
			pridejZpravu(z);
franta-hg@149
    57
franta-hg@149
    58
			/** TODO: zpracovávat další události – příkazy atd. */
franta-hg@149
    59
		}
franta-hg@149
    60
	}
franta-hg@149
    61
franta-hg@149
    62
	/**
franta-hg@149
    63
	 * @param z Zpráva, která se má přidat do fronty (historie).
franta-hg@149
    64
	 */
franta-hg@149
    65
	private void pridejZpravu(ZpravaChatu z) {
franta-hg@149
    66
		fronta.add(z);
franta-hg@149
    67
franta-hg@149
    68
		while (fronta.size() > nastaveni.getDelkaFronty()) {
franta-hg@149
    69
			fronta.removeFirst();
franta-hg@149
    70
		}
franta-hg@149
    71
	}
franta-hg@149
    72
franta-hg@149
    73
	public void posliZpravu(ZpravaChatu zprava) throws XMPPException {
franta-hg@149
    74
		muc.sendMessage(zprava.toString());
franta-hg@149
    75
	}
franta-hg@149
    76
franta-hg@149
    77
	public void odejdi() throws XMPPException {
franta-hg@149
    78
		if (nastaveni.getLouciciZprava() != null) {
franta-hg@149
    79
			muc.sendMessage(nastaveni.getLouciciZprava());
franta-hg@149
    80
		}
franta-hg@149
    81
		muc.leave();
franta-hg@149
    82
	}
franta-hg@149
    83
franta-hg@149
    84
	/**
franta-hg@149
    85
	 * @param nazev název místnosti (něco@moje.doména)
franta-hg@149
    86
	 * @return true, pokud se jedná o místnost s tímto názvem
franta-hg@149
    87
	 */
franta-hg@149
    88
	public boolean porovnejNazev(String nazev) {
franta-hg@149
    89
		return nazev.equals(nastaveni.getMuc());
franta-hg@149
    90
franta-hg@149
    91
	}
franta-hg@149
    92
franta-hg@149
    93
	public Collection<ZpravaChatu> getZpravy(int poradoveCislo) {
franta-hg@149
    94
		/**
franta-hg@149
    95
		 * TODO:
franta-hg@149
    96
		 * http://stackoverflow.com/questions/122105/java-what-is-the-best-way-to-filter-a-collection
franta-hg@149
    97
		 * http://www.javaworld.com/javaworld/jw-10-2004/jw-1018-filter.html
franta-hg@149
    98
		 */
franta-hg@149
    99
		Collection<ZpravaChatu> vysledek = new ArrayList<ZpravaChatu>();
franta-hg@149
   100
		for (ZpravaChatu z : fronta) {
franta-hg@149
   101
			if (z.getPoradoveCislo() > poradoveCislo) {
franta-hg@149
   102
				vysledek.add(z);
franta-hg@149
   103
			}
franta-hg@149
   104
		}
franta-hg@149
   105
		return vysledek;
franta-hg@149
   106
	}
franta-hg@149
   107
franta-hg@149
   108
	private int dalsiPoradoveCislo() {
franta-hg@149
   109
		pocitadloZprav++;
franta-hg@149
   110
		return pocitadloZprav;
franta-hg@149
   111
	}
franta-hg@149
   112
}