package com.sissi.ucenter.relation.muc.affiliation.impl;
import com.sissi.addressing.Addressing;
import com.sissi.config.Dictionary;
import com.sissi.context.JID;
import com.sissi.context.JIDBuilder;
import com.sissi.context.JIDContext;
import com.sissi.protocol.muc.XUser;
import com.sissi.ucenter.relation.Relation;
import com.sissi.ucenter.relation.muc.MucItem;
import com.sissi.ucenter.relation.muc.MucRelation;
import com.sissi.ucenter.relation.muc.MucRelationContext;
import com.sissi.ucenter.relation.muc.affiliation.AffiliationBroadcast;
import com.sissi.ucenter.relation.muc.room.Room;
import com.sissi.ucenter.relation.muc.room.RoomConfig;
import com.sissi.ucenter.relation.muc.status.CodeStatusAdder;
/**
* MUC岗位变更广播
*
* @author kim 2014年3月24日
*/
public class UpdateAffiliationBroadcast implements AffiliationBroadcast {
private final Addressing addressing;
private final JIDBuilder jidBuilder;
private final CodeStatusAdder adder;
private final MucRelationContext relationContext;
public UpdateAffiliationBroadcast(Addressing addressing, JIDBuilder jidBuilder, CodeStatusAdder adder, MucRelationContext relationContext) {
super();
this.adder = adder;
this.addressing = addressing;
this.jidBuilder = jidBuilder;
this.relationContext = relationContext;
}
@Override
public AffiliationBroadcast broadcast(JID group, Room room, MucItem item, JIDContext invoker) {
JID jid = this.jidBuilder.build(item.getJid());
// 向MUC房客广播MUC JID所有资源岗位变更
for (Relation relation : this.relationContext.ourRelations(jid, group)) {
for (JID to : this.relationContext.whoSubscribedMe(group)) {
this.addressing.findOne(to, true).write(item.presence(room.pull(Dictionary.FIELD_AFFILIATION, String.class)).add(this.adder.add(new XUser(group, to, room.allowed(to, RoomConfig.WHOISEXISTS, null)).item(item.hidden(room.allowed(to, RoomConfig.WHOISALLOW, jid)).relation(relation.cast(MucRelation.class).affiliation(item.getAffiliation(), true)))).cast(XUser.class)));
}
}
return this;
}
}