

const MESSAGE = WORLD.MESSAGE;
MESSAGE.pushUserMessage = function (toid, from, msg) {
    let user = this.stores.get(toid);
    if (!user) {
        user = new Map();
        this.stores.set(toid, user);
    }
    let store = user.get(from.id);
    if (!store) {
        store = { name: from.name, items: [] };
        user.set(from.id, store);
    }
    msg.index = store.items.length;
    store.items.push(msg);

}
MESSAGE.getUserMessages = function (me) {
    let store = this.stores.get(me.id);
    let newMessages = [];
    if (this.NOTICES.length) {
        let nt = this.NOTICES[this.NOTICES.length - 1];
        newMessages.push({
            id: "notice",
            content: nt.content.length > 50 ? nt.content.substring(0, 50) : nt.content,
            time: nt.time,
            name: "公告"
        });
    }
    if (store) {
        let diff_time = 24 * 3600000 * 30;
        let now = Date.now();
        store.forEach((x, y) => {
            let last = x.items[x.items.length - 1];
            if (last) {
                if (now - last.time < diff_time)
                    newMessages.push({
                        id: y,
                        name: x.name,
                        content: last.content,
                        time: last.time
                    });
            }
        });
    }
    return newMessages;
}
MESSAGE.getMessageFromID = function (me, from, count) {
    let items = [];
    if (from !== "notice") {
        let store = this.stores.get(me.id);
        if (!store) return;
        let list = store.get(from);
        if (!list) return items;
        items = list.items;
    } else {
        items = this.NOTICES;
    }
    count = count || 0;
    let ary = [];
    let diff_time = 24 * 3600000 * 30;
    let now = Date.now();
    for (let i = 0; i < 13; i++) {
        let index = items.length - count - i - 1;
        if (index < 0) break;
        if (now - items[index].time < diff_time)
            ary.push(items[index]);
    }
    return ary;
}
MESSAGE.getMessageByIndex = function (me, from, index) {
    let store = this.stores.get(me.id);
    if (!store) return;
    let list = store.get(from);
    return list && list.items[index];
}
MESSAGE.save = function () {

    let str = ["["];
    let now = Date.now();
    let diff_time = 24 * 3600000 * 30;
    this.stores.forEach((x, uid) => {
        if (str.length > 1) str.push(",");
        str.push("{id:\"");
        str.push(uid);
        str.push("\",items:[");
        let isReceive = false;
        x.forEach((st, from) => {
            if (isReceive) str.push(",");
            str.push("{uid:\"");
            str.push(from);
            str.push("\",name:\"");
            str.push(st.name);
            str.push("\",items:[");
            let ishasmsg = false;
            for (let i = 0; i < st.items.length; i++) {
                let item = st.items[i];
                if (now - item.time < diff_time) {
                    if (ishasmsg) str.push(",");
                    str.push("{time:");
                    str.push(item.time);
                    str.push(",content:`");
                    str.push(item.content);
                    str.push("`");
                    if (item.attach) {
                        str.push(",attach:[");
                        for (let j = 0; j < item.attach.length; j++) {
                            str.push("{name:\"");
                            str.push(item.attach[j].name);
                            str.push("\",obj:\"");
                            str.push(item.attach[j].obj);
                            str.push("\",count:");
                            str.push(item.attach[j].count || 1);
                            str.push("}");
                            if (j !== item.attach.length - 1) {
                                str.push(",");
                            }
                        }
                        str.push("]");
                        if (item.rec) {
                            str.push(",rec:true");
                        }
                    }
                    str.push("}");
                    ishasmsg = true;
                }
            }
            str.push("]}");
            isReceive = true;
        });
        str.push("]}");
    });
    str.push("]");
    return str.join("");
}
MESSAGE.saveNotice = function () {
    if (this.NOTICES.length > 500) this.NOTICES.splice(0, this.NOTICES.length - 500);
    return JSON.stringify(this.NOTICES);
}
MESSAGE.load = function (data) {
    this.NOTICES = data.notices ?? [];
    let sts = data.messages ?? [];
    if (!sts) return;
    for (let i = 0; i < sts.length; i++) {
        let st = sts[i];
        let user = new Map();
        for (let j = 0; j < st.items.length; j++) {
            let ust = st.items[j];
            let obj = {
                name: ust.name,
                items: []
            };
            for (let k = 0; k < ust.items.length; k++) {
                let msg = ust.items[k];
                obj.items.push({
                    content: msg.content,
                    time: msg.time,
                    rec: msg.rec,
                    attach: msg.attach,
                    index: obj.items.length
                });
            }
            user.set(ust.uid, obj);
        }
        this.stores.set(st.id, user);
    }
    console.log("消息数据已加载");
}
