XMPP chat – první verze.
1 package cz.frantovo.nekurak.chat;
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;
18 public class MistnostPripojena implements PacketListener {
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;
27 public MistnostPripojena(Mistnost mistnost, Spojeni spojeni) throws XMPPException {
29 mojePrezdivka = mistnost.getPrezdivka();
30 muc = new MultiUserChat(spojeni.getSpojeni(), mistnost.getMuc());
31 muc.join(mistnost.getPrezdivka());
33 if (mistnost.getUvitaciZprava() != null) {
34 muc.sendMessage(mistnost.getUvitaciZprava());
37 muc.addMessageListener(this);
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();
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;
54 /** Přidáme zprávu do fronty historie. */
55 ZpravaChatu z = new ZpravaChatu(od, text, overenyUzivatel, dalsiPoradoveCislo());
58 /** TODO: zpracovávat další události – příkazy atd. */
63 * @param z Zpráva, která se má přidat do fronty (historie).
65 private void pridejZpravu(ZpravaChatu z) {
68 while (fronta.size() > nastaveni.getDelkaFronty()) {
73 public void posliZpravu(ZpravaChatu zprava) throws XMPPException {
74 muc.sendMessage(zprava.toString());
77 public void odejdi() throws XMPPException {
78 if (nastaveni.getLouciciZprava() != null) {
79 muc.sendMessage(nastaveni.getLouciciZprava());
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
88 public boolean porovnejNazev(String nazev) {
89 return nazev.equals(nastaveni.getMuc());
93 public Collection<ZpravaChatu> getZpravy(int poradoveCislo) {
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
99 Collection<ZpravaChatu> vysledek = new ArrayList<ZpravaChatu>();
100 for (ZpravaChatu z : fronta) {
101 if (z.getPoradoveCislo() > poradoveCislo) {
108 private int dalsiPoradoveCislo() {
110 return pocitadloZprav;