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