import Channel from "../channel.js";
import { UserListJoinings, UserLists } from "../../../../models/index.js";
import { isUserRelated } from "../../../../misc/is-user-related.js";
export default class extends Channel {
    chName = "userList";
    static shouldShare = false;
    static requireCredential = false;
    listId;
    listUsers = [];
    listUsersClock;
    constructor(id, connection){
        super(id, connection);
        this.updateListUsers = this.updateListUsers.bind(this);
        this.onNote = this.withPackedNote(this.onNote.bind(this));
    }
    async init(params) {
        this.listId = params.listId;
        // Check existence and owner
        const exist = await UserLists.exist({
            where: {
                id: this.listId,
                userId: this.user.id
            }
        });
        if (!exist) return;
        // Subscribe stream
        this.subscriber.on(`userListStream:${this.listId}`, this.send);
        this.subscriber.on("notesStream", this.onNote);
        this.updateListUsers();
        this.listUsersClock = setInterval(this.updateListUsers, 5000);
    }
    async updateListUsers() {
        const users = await UserListJoinings.find({
            where: {
                userListId: this.listId
            },
            select: [
                "userId"
            ]
        });
        this.listUsers = users.map((x)=>x.userId);
    }
    async onNote(note) {
        if (note.visibility === "hidden") return;
        if (!this.listUsers.includes(note.userId)) 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.send("note", note);
    }
    dispose() {
        // Unsubscribe events
        this.subscriber.off(`userListStream:${this.listId}`, this.send);
        this.subscriber.off("notesStream", this.onNote);
        clearInterval(this.listUsersClock);
    }
}
