private final Packet packet;
private final Pattern ngWord;
private final Pattern ngId;
+ private String mainThreadId;
private Chat item;
private boolean itemKicked;
+ /**
+ * 処理するコメントの種別.
+ */
public enum ProcessType {
- NORMAL, OWNER;
+ /** 通常のコメント. */
+ NORMAL(false, false),
+ /** 投稿者コメント. */
+ OWNER(true, false),
+ /** オプショナルスレッドコメント. */
+ OPTIONAL(false, true),
+ /** オプショナルスレッド投稿者コメント. */
+ OPTIONAL_OWNER(true, true);
+ private final boolean owner;
+ private final boolean optional;
+
+ private ProcessType(boolean owner, boolean optional) {
+ this.owner = owner;
+ this.optional = optional;
+ }
+
+ boolean isOwner() {
+ return owner;
+ }
+
+ boolean isOptional() {
+ return optional;
+ }
}
+ /**
+ * コンストラクタ.
+ * @param types 処理するコメントの種別.
+ * @param packet
+ * @param ng_id NG ID.
+ * @param ng_word NG ワード.
+ */
public NicoXMLReader(Set<ProcessType> types, Packet packet, String ng_id, String ng_word) {
this.processTypes = EnumSet.copyOf(types);
this.packet = packet;
// 通常コメントを処理するか, 投稿者コメントを処理するか
final String fork = attributes.getValue("fork");
final boolean isOwner = "1".equals(fork);
- if (isOwner) {
- if (!processTypes.contains(ProcessType.OWNER)) {
- itemKicked = true;
- }
- } else {
- if (!processTypes.contains(ProcessType.NORMAL)) {
- itemKicked = true;
+ final String th = attributes.getValue("thread");
+
+ // 初めて見つけたthreadをメインスレッドとみなす
+ if(mainThreadId == null) {
+ mainThreadId = th;
+ }
+
+ final boolean isOptional = (mainThreadId == null) ? false : !mainThreadId.equals(th);
+
+ boolean nokick = false;
+ for(ProcessType pt : processTypes) {
+ if(pt.isOwner() == isOwner && pt.isOptional() == isOptional) {
+ nokick = true;
+ break;
}
}
+ if(!nokick) {
+ itemKicked = true;
+ return;
+ }
//マイメモリ削除対象
final String deleted = attributes.getValue("deleted");