import Channel from "../channel.js";
import { normalizeForSearch } from "../../../../misc/normalize-for-search.js";
import { isUserRelated } from "../../../../misc/is-user-related.js";
export default class extends Channel {
    chName = "hashtag";
    static shouldShare = false;
    static requireCredential = false;
    q;
    constructor(id, connection){
        super(id, connection);
        this.onNote = this.withPackedNote(this.onNote.bind(this));
    }
    async init(params) {
        this.q = params.q;
        if (this.q == null) return;
        // Subscribe stream
        this.subscriber.on("notesStream", this.onNote);
    }
    async onNote(note) {
        if (note.visibility === "hidden") return;
        const noteTags = note.tags ? note.tags.map((t)=>t.toLowerCase()) : [];
        const matched = this.q.some((tags)=>tags.every((tag)=>noteTags.includes(normalizeForSearch(tag))));
        if (!matched) return;
        // 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する
        if (isUserRelated(note, this.muting)) return;
        // 流れてきたNoteがブロックされているユーザーが関わるものだったら無視する
        if (isUserRelated(note, this.blocking)) return;
        if (note.renote && !note.text && this.renoteMuting.has(note.userId)) return;
        this.connection.cacheNote(note);
        this.send("note", note);
    }
    dispose() {
        // Unsubscribe events
        this.subscriber.off("notesStream", this.onNote);
    }
}
