/src/main/org/schwering/irc/manager/Channel.java

https://github.com/ViciousCake/Insane · Java · 536 lines · 428 code · 69 blank · 39 comment · 54 complexity · 5f4c3bd52bb0e85ee2183f160497c87f MD5 · raw file

  1. /*
  2. * IRClib -- A Java Internet Relay Chat library -- class IRCConnection
  3. * Copyright (C) 2002 - 2006 Christoph Schwering <schwering@gmail.com>
  4. *
  5. * This library and the accompanying materials are made available under the
  6. * terms of the
  7. * - GNU Lesser General Public License,
  8. * - Apache License, Version 2.0 and
  9. * - Eclipse Public License v1.0.
  10. * This library is distributed in the hope that it will be useful, but WITHOUT
  11. * ANY WARRANTY.
  12. */
  13. package org.schwering.irc.manager;
  14. import org.schwering.irc.manager.event.*;
  15. import java.util.*;
  16. /**
  17. * Represents an IRC channel. This object manages a list of users in the
  18. * channel, the channel's topic and a list of <code>ChannelListener</code>s
  19. * and a list of <code>CtcpListener</code>s which handle Ctcp events sent
  20. * to a whole channel.
  21. *
  22. * @author Christoph Schwering &lt;schwering@gmail.com&gt;
  23. * @version 1.00
  24. * @since 2.00
  25. */
  26. public class Channel implements Comparable {
  27. public static final int NONE = 0;
  28. public static final int VOICED = 1;
  29. public static final int OPERATOR = 2;
  30. private String name;
  31. private SortedMap users = new TreeMap();
  32. private Topic topic;
  33. private List banIDs;
  34. private Collection channelListeners = new LinkedList();
  35. private Collection ctcpListeners = new LinkedList();
  36. // TODO administer channel modes
  37. public Channel(String name) {
  38. if (name == null) {
  39. throw new IllegalArgumentException();
  40. }
  41. this.name = name;
  42. }
  43. public String getName() {
  44. return name;
  45. }
  46. public Collection getChannelUsers() {
  47. return Collections.unmodifiableCollection(users.values());
  48. }
  49. public ChannelUser getUser(String nick) {
  50. return (ChannelUser) users.get(nick);
  51. }
  52. public ChannelUser getUser(User user) {
  53. return (ChannelUser) users.get(user.getNick());
  54. }
  55. public boolean hasUser(String nick) {
  56. return users.containsKey(nick);
  57. }
  58. public boolean hasUser(User user) {
  59. return users.containsKey(user.getNick());
  60. }
  61. void addUser(User user) {
  62. users.put(user.getNick(), new ChannelUser(this, user));
  63. }
  64. void addUser(ChannelUser user) {
  65. users.put(user.getNick(), user);
  66. }
  67. ChannelUser removeUser(String nick) {
  68. return (ChannelUser) users.remove(nick);
  69. }
  70. ChannelUser removeUser(User user) {
  71. return (ChannelUser) users.remove(user.getNick());
  72. }
  73. void setUserStatus(String nick, int status) {
  74. ChannelUser channelUser = (ChannelUser) users.get(nick);
  75. if (channelUser != null) {
  76. channelUser.setStatus(status);
  77. }
  78. }
  79. /**
  80. * Returns the user's status or -1 if the user is not found.
  81. * Valid user status can be <code>UserStatusPair</code>'s
  82. * <code>NONE</code>, <code>OPERATOR</code>, <code>VOICED</code>.
  83. */
  84. public int getUserStatus(String nick) {
  85. ChannelUser channelUser = (ChannelUser) users.get(nick);
  86. if (channelUser != null) {
  87. return channelUser.getStatus();
  88. } else {
  89. return -1;
  90. }
  91. }
  92. void setUserStatus(User user, int status) {
  93. ChannelUser channelUser = (ChannelUser) users.get(user.getNick());
  94. if (channelUser != null) {
  95. channelUser.setStatus(status);
  96. }
  97. }
  98. /**
  99. * Returns the user's status or -1 if the user is not found.
  100. * Valid user status can be <code>UserStatusPair</code>'s
  101. * <code>NONE</code>, <code>OPERATOR</code>, <code>VOICED</code>.
  102. */
  103. public int getUserStatus(User user) {
  104. ChannelUser channelUser = (ChannelUser) users.get(user.getNick());
  105. if (channelUser != null) {
  106. return channelUser.getStatus();
  107. } else {
  108. return -1;
  109. }
  110. }
  111. public Topic getTopic() {
  112. return topic;
  113. }
  114. void setTopic(Topic topic) {
  115. this.topic = topic;
  116. }
  117. public List getBanIDs() {
  118. return Collections.unmodifiableList(banIDs);
  119. }
  120. void setBanIDs(List banIDs) {
  121. this.banIDs = banIDs;
  122. }
  123. public int compareTo(Object other) {
  124. return getName().compareToIgnoreCase(((Channel) other).getName());
  125. }
  126. public boolean isSame(Object obj) {
  127. if (obj == null) {
  128. return false;
  129. } else if (obj instanceof Channel) {
  130. return name.equalsIgnoreCase(((Channel) obj).name);
  131. } else if (obj instanceof String) {
  132. return name.equalsIgnoreCase((String) obj);
  133. } else {
  134. return false;
  135. }
  136. }
  137. public boolean equals(Object obj) {
  138. if (obj instanceof Channel) {
  139. return name.equalsIgnoreCase(((Channel) obj).name);
  140. } else {
  141. return false;
  142. }
  143. }
  144. public String toString() {
  145. return name;
  146. }
  147. /* ChannelListener methods */
  148. public synchronized void addChannelListener(ChannelListener listener) {
  149. channelListeners.add(listener);
  150. }
  151. public synchronized void removeChannelListener(ChannelListener listener) {
  152. channelListeners.remove(listener);
  153. }
  154. synchronized void fireUserJoined(UserParticipationEvent event) {
  155. for (Iterator it = channelListeners.iterator(); it.hasNext(); ) {
  156. try {
  157. ((ChannelListener) it.next()).userJoined(event);
  158. } catch (Exception exc) {
  159. handleException(exc);
  160. }
  161. }
  162. }
  163. synchronized void fireUserLeft(UserParticipationEvent event) {
  164. for (Iterator it = channelListeners.iterator(); it.hasNext(); ) {
  165. try {
  166. ((ChannelListener) it.next()).userLeft(event);
  167. } catch (Exception exc) {
  168. handleException(exc);
  169. }
  170. }
  171. }
  172. synchronized void fireUserStatusChanged(UserStatusEvent event) {
  173. for (Iterator it = channelListeners.iterator(); it.hasNext(); ) {
  174. try {
  175. ((ChannelListener) it.next()).userStatusChanged(event);
  176. } catch (Exception exc) {
  177. handleException(exc);
  178. }
  179. }
  180. }
  181. synchronized void fireTopicReceived(TopicEvent event) {
  182. for (Iterator it = channelListeners.iterator(); it.hasNext(); ) {
  183. try {
  184. ((ChannelListener) it.next()).topicReceived(event);
  185. } catch (Exception exc) {
  186. handleException(exc);
  187. }
  188. }
  189. }
  190. synchronized void fireChannelModeReceived(ChannelModeEvent event) {
  191. for (Iterator it = channelListeners.iterator(); it.hasNext(); ) {
  192. try {
  193. ((ChannelListener) it.next()).channelModeReceived(event);
  194. } catch (Exception exc) {
  195. handleException(exc);
  196. }
  197. }
  198. }
  199. synchronized void fireNickChanged(NickEvent event) {
  200. for (Iterator it = channelListeners.iterator(); it.hasNext(); ) {
  201. try {
  202. ((ChannelListener) it.next()).nickChanged(event);
  203. } catch (Exception exc) {
  204. handleException(exc);
  205. }
  206. }
  207. }
  208. synchronized void fireMessageReceived(MessageEvent event) {
  209. for (Iterator it = channelListeners.iterator(); it.hasNext(); ) {
  210. try {
  211. ((ChannelListener) it.next()).messageReceived(event);
  212. } catch (Exception exc) {
  213. handleException(exc);
  214. }
  215. }
  216. }
  217. synchronized void fireNoticeReceived(MessageEvent event) {
  218. for (Iterator it = channelListeners.iterator(); it.hasNext(); ) {
  219. try {
  220. ((ChannelListener) it.next()).noticeReceived(event);
  221. } catch (Exception exc) {
  222. handleException(exc);
  223. }
  224. }
  225. }
  226. synchronized void fireNamesReceived(NamesEvent event) {
  227. for (Iterator it = channelListeners.iterator(); it.hasNext(); ) {
  228. try {
  229. ((ChannelListener) it.next()).namesReceived(event);
  230. } catch (Exception exc) {
  231. handleException(exc);
  232. }
  233. }
  234. }
  235. synchronized void fireWhoReceived(WhoEvent event) {
  236. for (Iterator it = channelListeners.iterator(); it.hasNext(); ) {
  237. try {
  238. ((ChannelListener) it.next()).whoReceived(event);
  239. } catch (Exception exc) {
  240. handleException(exc);
  241. }
  242. }
  243. }
  244. synchronized void fireBanlistReceived(BanlistEvent event) {
  245. for (Iterator it = channelListeners.iterator(); it.hasNext(); ) {
  246. try {
  247. ((ChannelListener) it.next()).banlistReceived(event);
  248. } catch (Exception exc) {
  249. handleException(exc);
  250. }
  251. }
  252. }
  253. /* Ctcp listener methods */
  254. public synchronized void addCtcpListener(CtcpListener listener) {
  255. ctcpListeners.add(listener);
  256. }
  257. public synchronized void removeCtcpListener(CtcpListener listener) {
  258. ctcpListeners.remove(listener);
  259. }
  260. synchronized void fireCtcpDccChatReceived(CtcpDccChatEvent event) {
  261. for (Iterator it = ctcpListeners.iterator(); it.hasNext(); ) {
  262. try {
  263. ((CtcpListener) it.next()).dccChatReceived(event);
  264. } catch (Exception exc) {
  265. handleException(exc);
  266. }
  267. }
  268. }
  269. synchronized void fireCtcpDccSendReceived(CtcpDccSendEvent event) {
  270. for (Iterator it = ctcpListeners.iterator(); it.hasNext(); ) {
  271. try {
  272. ((CtcpListener) it.next()).dccSendReceived(event);
  273. } catch (Exception exc) {
  274. handleException(exc);
  275. }
  276. }
  277. }
  278. synchronized void fireCtcpSedReceived(CtcpSedEvent event) {
  279. for (Iterator it = ctcpListeners.iterator(); it.hasNext(); ) {
  280. try {
  281. ((CtcpListener) it.next()).sedReceived(event);
  282. } catch (Exception exc) {
  283. handleException(exc);
  284. }
  285. }
  286. }
  287. synchronized void fireCtcpActionReceived(CtcpActionEvent event) {
  288. for (Iterator it = ctcpListeners.iterator(); it.hasNext(); ) {
  289. try {
  290. ((CtcpListener) it.next()).actionReceived(event);
  291. } catch (Exception exc) {
  292. handleException(exc);
  293. }
  294. }
  295. }
  296. synchronized void fireCtcpPingRequestReceived(CtcpPingRequestEvent event) {
  297. for (Iterator it = ctcpListeners.iterator(); it.hasNext(); ) {
  298. try {
  299. ((CtcpListener) it.next()).pingRequestReceived(event);
  300. } catch (Exception exc) {
  301. handleException(exc);
  302. }
  303. }
  304. }
  305. synchronized void fireCtcpTimeRequestReceived(CtcpTimeRequestEvent event) {
  306. for (Iterator it = ctcpListeners.iterator(); it.hasNext(); ) {
  307. try {
  308. ((CtcpListener) it.next()).timeRequestReceived(event);
  309. } catch (Exception exc) {
  310. handleException(exc);
  311. }
  312. }
  313. }
  314. synchronized void fireCtcpVersionRequestReceived(CtcpVersionRequestEvent event) {
  315. for (Iterator it = ctcpListeners.iterator(); it.hasNext(); ) {
  316. try {
  317. ((CtcpListener) it.next()).versionRequestReceived(event);
  318. } catch (Exception exc) {
  319. handleException(exc);
  320. }
  321. }
  322. }
  323. synchronized void fireCtcpFingerRequestReceived(CtcpFingerRequestEvent event) {
  324. for (Iterator it = ctcpListeners.iterator(); it.hasNext(); ) {
  325. try {
  326. ((CtcpListener) it.next()).fingerRequestReceived(event);
  327. } catch (Exception exc) {
  328. handleException(exc);
  329. }
  330. }
  331. }
  332. synchronized void fireCtcpSourceRequestReceived(CtcpSourceRequestEvent event) {
  333. for (Iterator it = ctcpListeners.iterator(); it.hasNext(); ) {
  334. try {
  335. ((CtcpListener) it.next()).sourceRequestReceived(event);
  336. } catch (Exception exc) {
  337. handleException(exc);
  338. }
  339. }
  340. }
  341. synchronized void fireCtcpUserinfoRequestReceived(CtcpUserinfoRequestEvent event) {
  342. for (Iterator it = ctcpListeners.iterator(); it.hasNext(); ) {
  343. try {
  344. ((CtcpListener) it.next()).userinfoRequestReceived(event);
  345. } catch (Exception exc) {
  346. handleException(exc);
  347. }
  348. }
  349. }
  350. synchronized void fireCtcpClientinfoRequestReceived(CtcpClientinfoRequestEvent event) {
  351. for (Iterator it = ctcpListeners.iterator(); it.hasNext(); ) {
  352. try {
  353. ((CtcpListener) it.next()).clientinfoRequestReceived(event);
  354. } catch (Exception exc) {
  355. handleException(exc);
  356. }
  357. }
  358. }
  359. synchronized void fireCtcpErrmsgRequestReceived(CtcpErrmsgRequestEvent event) {
  360. for (Iterator it = ctcpListeners.iterator(); it.hasNext(); ) {
  361. try {
  362. ((CtcpListener) it.next()).errmsgRequestReceived(event);
  363. } catch (Exception exc) {
  364. handleException(exc);
  365. }
  366. }
  367. }
  368. synchronized void fireCtcpUnknownRequestEventReceived(
  369. CtcpUnknownRequestEvent event) {
  370. for (Iterator it = ctcpListeners.iterator(); it.hasNext(); ) {
  371. try {
  372. ((CtcpListener) it.next()).unknownRequestEventReceived(event);
  373. } catch (Exception exc) {
  374. handleException(exc);
  375. }
  376. }
  377. }
  378. synchronized void fireCtcpPingReplyReceived(CtcpPingReplyEvent event) {
  379. for (Iterator it = ctcpListeners.iterator(); it.hasNext(); ) {
  380. try {
  381. ((CtcpListener) it.next()).pingReplyReceived(event);
  382. } catch (Exception exc) {
  383. handleException(exc);
  384. }
  385. }
  386. }
  387. synchronized void fireCtcpTimeReplyReceived(CtcpTimeReplyEvent event) {
  388. for (Iterator it = ctcpListeners.iterator(); it.hasNext(); ) {
  389. try {
  390. ((CtcpListener) it.next()).timeReplyReceived(event);
  391. } catch (Exception exc) {
  392. handleException(exc);
  393. }
  394. }
  395. }
  396. synchronized void fireCtcpVersionReplyReceived(CtcpVersionReplyEvent event) {
  397. for (Iterator it = ctcpListeners.iterator(); it.hasNext(); ) {
  398. try {
  399. ((CtcpListener) it.next()).versionReplyReceived(event);
  400. } catch (Exception exc) {
  401. handleException(exc);
  402. }
  403. }
  404. }
  405. synchronized void fireCtcpFingerReplyReceived(CtcpFingerReplyEvent event) {
  406. for (Iterator it = ctcpListeners.iterator(); it.hasNext(); ) {
  407. try {
  408. ((CtcpListener) it.next()).fingerReplyReceived(event);
  409. } catch (Exception exc) {
  410. handleException(exc);
  411. }
  412. }
  413. }
  414. synchronized void fireCtcpSourceReplyReceived(CtcpSourceReplyEvent event) {
  415. for (Iterator it = ctcpListeners.iterator(); it.hasNext(); ) {
  416. try {
  417. ((CtcpListener) it.next()).sourceReplyReceived(event);
  418. } catch (Exception exc) {
  419. handleException(exc);
  420. }
  421. }
  422. }
  423. synchronized void fireCtcpUserinfoReplyReceived(CtcpUserinfoReplyEvent event) {
  424. for (Iterator it = ctcpListeners.iterator(); it.hasNext(); ) {
  425. try {
  426. ((CtcpListener) it.next()).userinfoReplyReceived(event);
  427. } catch (Exception exc) {
  428. handleException(exc);
  429. }
  430. }
  431. }
  432. synchronized void fireCtcpClientinfoReplyReceived(CtcpClientinfoReplyEvent event) {
  433. for (Iterator it = ctcpListeners.iterator(); it.hasNext(); ) {
  434. try {
  435. ((CtcpListener) it.next()).clientinfoReplyReceived(event);
  436. } catch (Exception exc) {
  437. handleException(exc);
  438. }
  439. }
  440. }
  441. synchronized void fireCtcpErrmsgReplyReceived(CtcpErrmsgReplyEvent event) {
  442. for (Iterator it = ctcpListeners.iterator(); it.hasNext(); ) {
  443. try {
  444. ((CtcpListener) it.next()).errmsgReplyReceived(event);
  445. } catch (Exception exc) {
  446. handleException(exc);
  447. }
  448. }
  449. }
  450. synchronized void fireCtcpUnknownReplyEventReceived(
  451. CtcpUnknownReplyEvent event) {
  452. for (Iterator it = ctcpListeners.iterator(); it.hasNext(); ) {
  453. try {
  454. ((CtcpListener) it.next()).unknownReplyEventReceived(event);
  455. } catch (Exception exc) {
  456. handleException(exc);
  457. }
  458. }
  459. }
  460. /**
  461. * Called by the fire-methods when the handler method of a listener
  462. * throws an exception.
  463. */
  464. private void handleException(Exception exc) {
  465. exc.printStackTrace();
  466. }
  467. }