franta-hg@149: package cz.frantovo.nekurak.chat; franta-hg@149: franta-hg@149: import cz.frantovo.nekurak.dto.ZpravaChatu; franta-hg@149: import java.util.ArrayList; franta-hg@149: import java.util.Collection; franta-hg@149: import java.util.LinkedList; franta-hg@149: import org.jivesoftware.smack.PacketListener; franta-hg@149: import org.jivesoftware.smack.XMPPException; franta-hg@149: import org.jivesoftware.smack.packet.Message; franta-hg@149: import org.jivesoftware.smack.packet.Packet; franta-hg@149: import org.jivesoftware.smack.util.StringUtils; franta-hg@149: import org.jivesoftware.smackx.muc.MultiUserChat; franta-hg@149: franta-hg@149: /** franta-hg@149: * franta-hg@149: * @author fiki franta-hg@149: */ franta-hg@149: public class MistnostPripojena implements PacketListener { franta-hg@149: franta-hg@149: private final MultiUserChat muc; franta-hg@149: private final Mistnost nastaveni; franta-hg@149: private final LinkedList fronta = new LinkedList(); franta-hg@149: private final String mojePrezdivka; franta-hg@149: /** Zatím nejvyšší pořadové číslo – poradoveCislo. */ franta-hg@149: private int pocitadloZprav = 0; franta-hg@149: franta-hg@149: public MistnostPripojena(Mistnost mistnost, Spojeni spojeni) throws XMPPException { franta-hg@149: nastaveni = mistnost; franta-hg@149: mojePrezdivka = mistnost.getPrezdivka(); franta-hg@149: muc = new MultiUserChat(spojeni.getSpojeni(), mistnost.getMuc()); franta-hg@149: muc.join(mistnost.getPrezdivka()); franta-hg@149: franta-hg@149: if (mistnost.getUvitaciZprava() != null) { franta-hg@149: muc.sendMessage(mistnost.getUvitaciZprava()); franta-hg@149: } franta-hg@149: franta-hg@149: muc.addMessageListener(this); franta-hg@149: } franta-hg@149: franta-hg@149: public void processPacket(Packet packet) { franta-hg@149: if (packet instanceof Message) { franta-hg@149: Message m = (Message) packet; franta-hg@149: String od = StringUtils.parseResource(m.getFrom()); franta-hg@149: String text = m.getBody(); franta-hg@149: franta-hg@149: /** Vydolujeme jméno z anonymně (námi) poslaných zpráv */ franta-hg@149: boolean overenyUzivatel = true; franta-hg@149: if (mojePrezdivka.equals(od) && text.contains(":")) { franta-hg@149: od = text.split(":")[0]; franta-hg@149: text = text.substring(od.length() + 2); franta-hg@149: overenyUzivatel = false; franta-hg@149: } franta-hg@149: franta-hg@149: /** Přidáme zprávu do fronty historie. */ franta-hg@149: ZpravaChatu z = new ZpravaChatu(od, text, overenyUzivatel, dalsiPoradoveCislo()); franta-hg@149: pridejZpravu(z); franta-hg@149: franta-hg@149: /** TODO: zpracovávat další události – příkazy atd. */ franta-hg@149: } franta-hg@149: } franta-hg@149: franta-hg@149: /** franta-hg@149: * @param z Zpráva, která se má přidat do fronty (historie). franta-hg@149: */ franta-hg@149: private void pridejZpravu(ZpravaChatu z) { franta-hg@149: fronta.add(z); franta-hg@149: franta-hg@149: while (fronta.size() > nastaveni.getDelkaFronty()) { franta-hg@149: fronta.removeFirst(); franta-hg@149: } franta-hg@149: } franta-hg@149: franta-hg@149: public void posliZpravu(ZpravaChatu zprava) throws XMPPException { franta-hg@149: muc.sendMessage(zprava.toString()); franta-hg@149: } franta-hg@149: franta-hg@149: public void odejdi() throws XMPPException { franta-hg@149: if (nastaveni.getLouciciZprava() != null) { franta-hg@149: muc.sendMessage(nastaveni.getLouciciZprava()); franta-hg@149: } franta-hg@149: muc.leave(); franta-hg@149: } franta-hg@149: franta-hg@149: /** franta-hg@149: * @param nazev název místnosti (něco@moje.doména) franta-hg@149: * @return true, pokud se jedná o místnost s tímto názvem franta-hg@149: */ franta-hg@149: public boolean porovnejNazev(String nazev) { franta-hg@149: return nazev.equals(nastaveni.getMuc()); franta-hg@149: franta-hg@149: } franta-hg@149: franta-hg@149: public Collection getZpravy(int poradoveCislo) { franta-hg@149: /** franta-hg@149: * TODO: franta-hg@149: * http://stackoverflow.com/questions/122105/java-what-is-the-best-way-to-filter-a-collection franta-hg@149: * http://www.javaworld.com/javaworld/jw-10-2004/jw-1018-filter.html franta-hg@149: */ franta-hg@149: Collection vysledek = new ArrayList(); franta-hg@149: for (ZpravaChatu z : fronta) { franta-hg@149: if (z.getPoradoveCislo() > poradoveCislo) { franta-hg@149: vysledek.add(z); franta-hg@149: } franta-hg@149: } franta-hg@149: return vysledek; franta-hg@149: } franta-hg@149: franta-hg@149: private int dalsiPoradoveCislo() { franta-hg@149: pocitadloZprav++; franta-hg@149: return pocitadloZprav; franta-hg@149: } franta-hg@149: }