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