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