java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/chat/MistnostPripojena.java
changeset 149 8238cdb4113a
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/chat/MistnostPripojena.java	Wed Jun 30 00:26:14 2010 +0200
     1.3 @@ -0,0 +1,112 @@
     1.4 +package cz.frantovo.nekurak.chat;
     1.5 +
     1.6 +import cz.frantovo.nekurak.dto.ZpravaChatu;
     1.7 +import java.util.ArrayList;
     1.8 +import java.util.Collection;
     1.9 +import java.util.LinkedList;
    1.10 +import org.jivesoftware.smack.PacketListener;
    1.11 +import org.jivesoftware.smack.XMPPException;
    1.12 +import org.jivesoftware.smack.packet.Message;
    1.13 +import org.jivesoftware.smack.packet.Packet;
    1.14 +import org.jivesoftware.smack.util.StringUtils;
    1.15 +import org.jivesoftware.smackx.muc.MultiUserChat;
    1.16 +
    1.17 +/**
    1.18 + *
    1.19 + * @author fiki
    1.20 + */
    1.21 +public class MistnostPripojena implements PacketListener {
    1.22 +
    1.23 +	private final MultiUserChat muc;
    1.24 +	private final Mistnost nastaveni;
    1.25 +	private final LinkedList<ZpravaChatu> fronta = new LinkedList<ZpravaChatu>();
    1.26 +	private final String mojePrezdivka;
    1.27 +	/** Zatím nejvyšší pořadové číslo – poradoveCislo. */
    1.28 +	private int pocitadloZprav = 0;
    1.29 +
    1.30 +	public MistnostPripojena(Mistnost mistnost, Spojeni spojeni) throws XMPPException {
    1.31 +		nastaveni = mistnost;
    1.32 +		mojePrezdivka = mistnost.getPrezdivka();
    1.33 +		muc = new MultiUserChat(spojeni.getSpojeni(), mistnost.getMuc());
    1.34 +		muc.join(mistnost.getPrezdivka());
    1.35 +
    1.36 +		if (mistnost.getUvitaciZprava() != null) {
    1.37 +			muc.sendMessage(mistnost.getUvitaciZprava());
    1.38 +		}
    1.39 +
    1.40 +		muc.addMessageListener(this);
    1.41 +	}
    1.42 +
    1.43 +	public void processPacket(Packet packet) {
    1.44 +		if (packet instanceof Message) {
    1.45 +			Message m = (Message) packet;
    1.46 +			String od = StringUtils.parseResource(m.getFrom());
    1.47 +			String text = m.getBody();
    1.48 +
    1.49 +			/** Vydolujeme jméno z anonymně (námi) poslaných zpráv */
    1.50 +			boolean overenyUzivatel = true;
    1.51 +			if (mojePrezdivka.equals(od) && text.contains(":")) {
    1.52 +				od = text.split(":")[0];
    1.53 +				text = text.substring(od.length() + 2);
    1.54 +				overenyUzivatel = false;
    1.55 +			}
    1.56 +
    1.57 +			/** Přidáme zprávu do fronty historie. */
    1.58 +			ZpravaChatu z = new ZpravaChatu(od, text, overenyUzivatel, dalsiPoradoveCislo());
    1.59 +			pridejZpravu(z);
    1.60 +
    1.61 +			/** TODO: zpracovávat další události – příkazy atd. */
    1.62 +		}
    1.63 +	}
    1.64 +
    1.65 +	/**
    1.66 +	 * @param z Zpráva, která se má přidat do fronty (historie).
    1.67 +	 */
    1.68 +	private void pridejZpravu(ZpravaChatu z) {
    1.69 +		fronta.add(z);
    1.70 +
    1.71 +		while (fronta.size() > nastaveni.getDelkaFronty()) {
    1.72 +			fronta.removeFirst();
    1.73 +		}
    1.74 +	}
    1.75 +
    1.76 +	public void posliZpravu(ZpravaChatu zprava) throws XMPPException {
    1.77 +		muc.sendMessage(zprava.toString());
    1.78 +	}
    1.79 +
    1.80 +	public void odejdi() throws XMPPException {
    1.81 +		if (nastaveni.getLouciciZprava() != null) {
    1.82 +			muc.sendMessage(nastaveni.getLouciciZprava());
    1.83 +		}
    1.84 +		muc.leave();
    1.85 +	}
    1.86 +
    1.87 +	/**
    1.88 +	 * @param nazev název místnosti (něco@moje.doména)
    1.89 +	 * @return true, pokud se jedná o místnost s tímto názvem
    1.90 +	 */
    1.91 +	public boolean porovnejNazev(String nazev) {
    1.92 +		return nazev.equals(nastaveni.getMuc());
    1.93 +
    1.94 +	}
    1.95 +
    1.96 +	public Collection<ZpravaChatu> getZpravy(int poradoveCislo) {
    1.97 +		/**
    1.98 +		 * TODO:
    1.99 +		 * http://stackoverflow.com/questions/122105/java-what-is-the-best-way-to-filter-a-collection
   1.100 +		 * http://www.javaworld.com/javaworld/jw-10-2004/jw-1018-filter.html
   1.101 +		 */
   1.102 +		Collection<ZpravaChatu> vysledek = new ArrayList<ZpravaChatu>();
   1.103 +		for (ZpravaChatu z : fronta) {
   1.104 +			if (z.getPoradoveCislo() > poradoveCislo) {
   1.105 +				vysledek.add(z);
   1.106 +			}
   1.107 +		}
   1.108 +		return vysledek;
   1.109 +	}
   1.110 +
   1.111 +	private int dalsiPoradoveCislo() {
   1.112 +		pocitadloZprav++;
   1.113 +		return pocitadloZprav;
   1.114 +	}
   1.115 +}