IRC: Fire delivery failed in case of unvoiced user sending message to moderated channel.

cefexperiments
Danny van Heumen 11 years ago
parent 6298cb6282
commit 355d4f0d54

@ -982,6 +982,7 @@ private void fireMessageDeliveredEvent(final Message message)
for (ChatRoomMessageListener listener : listeners)
{
// TODO shouldn't we catch in case of exception?
listener.messageDelivered(msgDeliveredEvt);
}
}
@ -1014,10 +1015,40 @@ public void fireMessageReceivedEvent(final Message message,
for (ChatRoomMessageListener listener : listeners)
{
// TODO shouldn't we catch in case of exception?
listener.messageReceived(event);
}
}
/**
* Notifies interested listeners that a message delivery has failed.
*
* @param errorCode the type of error that occurred
* @param reason the reason of delivery failure
* @param date the date the event was received
* @param message the message that was failed to be delivered
*/
public void fireMessageDeliveryFailedEvent(final int errorCode,
final String reason, final Date date, final Message message)
{
final ChatRoomMessageDeliveryFailedEvent event =
new ChatRoomMessageDeliveryFailedEvent(this, null, errorCode,
reason, date, message);
final Iterable<ChatRoomMessageListener> listeners;
synchronized (messageListeners)
{
listeners
= new ArrayList<ChatRoomMessageListener>(messageListeners);
}
for (final ChatRoomMessageListener listener : listeners)
{
// TODO shouldn't we catch in case of exception?
listener.messageDeliveryFailed(event);
}
}
/**
* Delivers the specified event to all registered property change listeners.
*

@ -1469,14 +1469,18 @@ public void onUserQuit(final QuitMessage msg)
private final class ChatRoomListener
extends VariousMessageListenerAdapter
{
/**
* IRC error code for case when user cannot send a message to the
* channel, for example when this channel is moderated and user does not
* have VOICE (+v).
*/
private static final int IRC_ERR_CANNOTSENDTOCHAN = 404;
/**
* IRC error code for case where user is not joined to that channel.
*/
private static final int IRC_ERR_NOTONCHANNEL = 442;
// FIXME Handle 404 ERR_CANNOTSENDTOCHAN in case of moderated channels
// (no voice) or +n and not joined.
/**
* IRCApi instance.
*/
@ -1619,8 +1623,9 @@ public void onServerNumericMessage(final ServerNumericMessage msg)
return;
}
final String raw = msg.getText();
if (code.intValue() == IRC_ERR_NOTONCHANNEL)
switch (code.intValue())
{
case IRC_ERR_NOTONCHANNEL:
final String channel = raw.substring(0, raw.indexOf(" "));
if (isThisChatRoom(channel))
{
@ -1635,6 +1640,23 @@ public void onServerNumericMessage(final ServerNumericMessage msg)
// our problem ASAP.
leaveChatRoom();
}
break;
case IRC_ERR_CANNOTSENDTOCHAN:
final String cannotSendChannel =
raw.substring(0, raw.indexOf(" "));
if (isThisChatRoom(cannotSendChannel))
{
final MessageIrcImpl message =
new MessageIrcImpl("", "text/plain", "UTF-8", null);
this.chatroom.fireMessageDeliveryFailedEvent(
ChatRoomMessageDeliveryFailedEvent.FORBIDDEN,
"This channel is moderated.", new Date(), message);
}
break;
default:
break;
}
}

Loading…
Cancel
Save