package com.sissi.pipeline.in.presence.muc;
import com.sissi.context.JID;
import com.sissi.context.JIDContext;
import com.sissi.persistent.Recover;
import com.sissi.pipeline.in.ProxyProcessor;
import com.sissi.protocol.Element;
import com.sissi.protocol.Protocol;
import com.sissi.protocol.message.Message;
import com.sissi.protocol.muc.XMuc;
import com.sissi.protocol.offline.Delay;
import com.sissi.protocol.presence.Presence;
import com.sissi.ucenter.relation.muc.room.Room;
import com.sissi.ucenter.relation.muc.room.RoomBuilder;
import com.sissi.ucenter.relation.muc.room.RoomConfig;
/**
* 历史消息
*
* @author kim 2014年3月7日
*/
public class PresenceMucJoin2SelfMessageHistoryProcessor extends ProxyProcessor {
private final Recover recover;
private final RoomBuilder room;
public PresenceMucJoin2SelfMessageHistoryProcessor(Recover recover, RoomBuilder room) {
super();
this.recover = recover;
this.room = room;
}
/*
* 房间如果为Hidden则Delay.From = message.from.bare, 否则为真实JID
*
* @see com.sissi.pipeline.Input#input(com.sissi.context.JIDContext, com.sissi.protocol.Protocol)
*/
@Override
public boolean input(JIDContext context, Protocol protocol) {
XMuc x = protocol.cast(Presence.class).findField(XMuc.NAME, XMuc.class);
if (x.hasHistory()) {
JID group = super.build(protocol.getTo());
Room room = this.room.build(group);
for (Element message : this.recover.pull(group, x.history())) {
Delay delay = Message.class.cast(message).getDelay();
delay.setFrom(room.allowed(context.jid(), RoomConfig.WHOISALLOW, super.build(delay.getFrom())) ? super.build(message.getFrom()).asStringWithBare() : delay.getFrom());
context.write(message);
}
}
return true;
}
}