Commit 529aa459 authored by nanahira's avatar nanahira

chat color

parent 8b1eeeb0
......@@ -13,6 +13,7 @@ const RandomDuelBan_1 = require("./entities/RandomDuelBan");
const underscore_1 = __importDefault(require("underscore"));
const DuelLog_1 = require("./entities/DuelLog");
const DuelLogPlayer_1 = require("./entities/DuelLogPlayer");
const User_1 = require("./entities/User");
class DataManager {
constructor(config, log) {
this.config = config;
......@@ -272,6 +273,71 @@ class DataManager {
}
});
}
async getUser(key) {
const repo = this.db.getRepository(User_1.User);
try {
const user = await repo.findOne(key);
return user;
}
catch (e) {
this.log.warn(`Failed to fetch user: ${e.toString()}`);
return null;
}
}
async getOrCreateUser(key) {
const user = await this.getUser(key);
if (user) {
return user;
}
const newUser = new User_1.User();
newUser.key = key;
return await this.saveUser(newUser);
}
async saveUser(user) {
const repo = this.db.getRepository(User_1.User);
try {
return await repo.save(user);
}
catch (e) {
this.log.warn(`Failed to save user: ${e.toString()}`);
return null;
}
}
async getUserChatColor(key) {
const user = await this.getUser(key);
return user ? user.chatColor : null;
}
async setUserChatColor(key, color) {
let user = await this.getUser(key);
if (!user) {
user = new User_1.User();
user.key = key;
}
user.chatColor = color;
return await this.saveUser(user);
}
async migrateChatColors(data) {
await this.db.transaction(async (mdb) => {
try {
const users = [];
for (let key in data) {
const chatColor = data[key];
let user = await mdb.findOne(User_1.User, key);
if (!user) {
user = new User_1.User();
user.key = key;
}
user.chatColor = chatColor;
users.push(user);
}
await mdb.save(users);
}
catch (e) {
this.log.warn(`Failed to migrate chat color data: ${e.toString()}`);
return null;
}
});
}
}
exports.DataManager = DataManager;
//# sourceMappingURL=DataManager.js.map
\ No newline at end of file
......@@ -10,6 +10,7 @@ import _ from "underscore";
import {DuelLog} from "./entities/DuelLog";
import {Deck} from "./DeckEncoder";
import {DuelLogPlayer} from "./entities/DuelLogPlayer";
import {User} from "./entities/User";
interface BasePlayerInfo {
name: string;
......@@ -301,4 +302,68 @@ export class DataManager {
});
}
async getUser(key: string) {
const repo = this.db.getRepository(User);
try {
const user = await repo.findOne(key);
return user;
} catch (e) {
this.log.warn(`Failed to fetch user: ${e.toString()}`);
return null;
}
}
async getOrCreateUser(key: string) {
const user = await this.getUser(key);
if(user) {
return user;
}
const newUser = new User();
newUser.key = key;
return await this.saveUser(newUser);
}
async saveUser(user: User) {
const repo = this.db.getRepository(User);
try {
return await repo.save(user);
} catch (e) {
this.log.warn(`Failed to save user: ${e.toString()}`);
return null;
}
}
async getUserChatColor(key: string) {
const user = await this.getUser(key);
return user ? user.chatColor : null;
}
async setUserChatColor(key: string, color: string) {
let user = await this.getUser(key);
if(!user) {
user = new User();
user.key = key;
}
user.chatColor = color;
return await this.saveUser(user);
}
async migrateChatColors(data: any) {
await this.db.transaction(async (mdb) => {
try {
const users: User[] = [];
for(let key in data) {
const chatColor: string = data[key];
let user = await mdb.findOne(User, key);
if(!user) {
user = new User();
user.key = key;
}
user.chatColor = chatColor;
users.push(user);
}
await mdb.save(users);
} catch (e) {
this.log.warn(`Failed to migrate chat color data: ${e.toString()}`);
return null;
}
});
}
}
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.User = void 0;
const typeorm_1 = require("typeorm");
let User = class User {
};
__decorate([
typeorm_1.PrimaryColumn({ type: "varchar", length: 128 }),
__metadata("design:type", String)
], User.prototype, "key", void 0);
__decorate([
typeorm_1.Column("varchar", { length: 16, nullable: true }),
__metadata("design:type", String)
], User.prototype, "chatColor", void 0);
User = __decorate([
typeorm_1.Entity()
], User);
exports.User = User;
//# sourceMappingURL=User.js.map
\ No newline at end of file
import {Column, Entity, PrimaryColumn} from "typeorm";
@Entity()
export class User {
@PrimaryColumn({type: "varchar", length: 128})
key: string;
@Column("varchar", {length: 16, nullable: true})
chatColor: string;
}
......@@ -24,14 +24,6 @@
]
}
},
"duel_log": {
"file": "./config/duel_log.json",
"duel_log": []
},
"chat_color": {
"file": "./config/chat_color.json",
"save_list": {}
},
"users": {
"file": "./config/admin_user.json",
"permission_examples": {
......
......@@ -174,7 +174,6 @@ settings = {}
tips = null
dialogues = null
badwords = null
chat_color = null
lflists = global.lflists = []
real_windbot_server_ip = null
long_resolve_cards = []
......@@ -303,6 +302,24 @@ init = () ->
#finish
if imported
await setting_save(settings)
if settings.modules.mysql.enabled
DataManager = require('./data-manager/DataManager.js').DataManager
dataManager = global.dataManager = new DataManager(settings.modules.mysql.db, log)
await dataManager.init()
else
log.warn("Some functions may be limited without MySQL .")
if settings.modules.cloud_replay.enabled
settings.modules.cloud_replay.enabled = false
await setting_save(settings)
log.warn("Cloud replay cannot be enabled because no MySQL.")
if settings.modules.enable_recover.enabled
settings.modules.enable_recover.enabled = false
await setting_save(settings)
log.warn("Recover mode cannot be enabled because no MySQL.")
if settings.modules.chat_color.enabled
settings.modules.chat_color.enabled = false
await setting_save(settings)
log.warn("Chat color cannot be enabled because no MySQL.")
# 读取数据
default_data = await loadJSONAsync('./data/default_data.json')
try
......@@ -320,12 +337,14 @@ init = () ->
catch
badwords = global.badwords = default_data.badwords
await setting_save(badwords)
if settings.modules.chat_color.enabled
if settings.modules.chat_color.enabled and await checkFileExists('./config/chat_color.json')
try
chat_color = global.chat_color = await loadJSONAsync('./config/chat_color.json')
chat_color = await loadJSONAsync('./config/chat_color.json')
if chat_color
await dataManager.migrateChatColors(chat_color.save_list);
await fs.promises.unlink('./config/chat_color.json')
log.info("Chat color migrated.")
catch
chat_color = global.chat_color = default_data.chat_color
await setting_save(chat_color)
try
cppversion = parseInt(await fs.promises.readFile('ygopro/gframe/game.cpp', 'utf8').match(/PRO_VERSION = ([x\dABCDEF]+)/)[1], '16')
await setting_change(settings, "version", cppversion)
......@@ -357,24 +376,6 @@ init = () ->
roomlist = global.roomlist = require './roomlist.js'
if settings.modules.i18n.auto_pick
geoip = require('geoip-country-lite')
if settings.modules.mysql.enabled
DataManager = require('./data-manager/DataManager.js').DataManager
dataManager = global.dataManager = new DataManager(settings.modules.mysql.db, log)
await dataManager.init()
else
log.warn("Some functions may be limited without MySQL .")
if settings.modules.cloud_replay.enabled
settings.modules.cloud_replay.enabled = false
await setting_save(settings)
log.warn("Cloud replay cannot be enabled because no MySQL.")
if settings.modules.enable_recover.enabled
settings.modules.enable_recover.enabled = false
await setting_save(settings)
log.warn("Recover mode cannot be enabled because no MySQL.")
if settings.modules.chat_color.enabled
settings.modules.chat_color.enabled = false
await setting_save(settings)
log.warn("Chat color cannot be enabled because no MySQL.")
if settings.modules.mycard.enabled
pgClient = require('pg').Client
......@@ -3163,19 +3164,18 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server, datas)->
for cname,cvalue of ygopro.constants.COLORS when cvalue > 10
ygopro.stoc_send_chat(client, cname, cvalue)
else if cmsg.toLowerCase() == "default"
chat_color.save_list[cip] = false
setting_save(chat_color)
await dataManager.setUserChatColor(cip, null)
ygopro.stoc_send_chat(client, "${set_chat_color_default}", ygopro.constants.COLORS.BABYBLUE)
else
ccolor = cmsg.toUpperCase()
if ygopro.constants.COLORS[ccolor] and ygopro.constants.COLORS[ccolor] > 10 and ygopro.constants.COLORS[ccolor] < 20
chat_color.save_list[cip] = ccolor
setting_save(chat_color)
await dataManager.setUserChatColor(cip, ccolor)
ygopro.stoc_send_chat(client, "${set_chat_color_part1}" + ccolor + "${set_chat_color_part2}", ygopro.constants.COLORS.BABYBLUE)
else
ygopro.stoc_send_chat(client, "${color_not_found_part1}" + ccolor + "${color_not_found_part2}", ygopro.constants.COLORS.RED)
else
if color = chat_color.save_list[cip]
color = await dataManager.getUserChatColor(cip)
if color
ygopro.stoc_send_chat(client, "${get_chat_color_part1}" + color + "${get_chat_color_part2}", ygopro.constants.COLORS.BABYBLUE)
else
ygopro.stoc_send_chat(client, "${get_chat_color_default}", ygopro.constants.COLORS.BABYBLUE)
......@@ -3470,7 +3470,7 @@ ygopro.stoc_follow 'CHAT', true, (buffer, info, client, server, datas)->
for player in room.players when player and player.pos == pid
tplayer = player
return unless tplayer
tcolor = chat_color.save_list[CLIENT_get_authorize_key(tplayer)]
tcolor = await dataManager.getUserChatColor(CLIENT_get_authorize_key(tplayer));
if tcolor
ygopro.stoc_send client, 'CHAT', {
player: ygopro.constants.COLORS[tcolor]
......
// Generated by CoffeeScript 2.5.1
(function() {
// 标准库
var CLIENT_get_authorize_key, CLIENT_get_kick_reconnect_target, CLIENT_heartbeat_register, CLIENT_heartbeat_unregister, CLIENT_import_data, CLIENT_is_able_to_kick_reconnect, CLIENT_is_able_to_reconnect, CLIENT_is_banned_by_mc, CLIENT_is_player, CLIENT_kick, CLIENT_kick_reconnect, CLIENT_pre_reconnect, CLIENT_reconnect, CLIENT_reconnect_register, CLIENT_reconnect_unregister, CLIENT_send_pre_reconnect_info, CLIENT_send_reconnect_info, CLIENT_send_replays, Q, ROOM_all, ROOM_bad_ip, ROOM_ban_player, ROOM_clear_disconnect, ROOM_connected_ip, ROOM_find_by_name, ROOM_find_by_pid, ROOM_find_by_port, ROOM_find_by_title, ROOM_find_or_create_ai, ROOM_find_or_create_by_name, ROOM_find_or_create_random, ROOM_kick, ROOM_player_flee, ROOM_player_get_score, ROOM_player_lose, ROOM_player_win, ROOM_players_oppentlist, ROOM_players_scores, ROOM_unwelcome, ROOM_validate, ReplayParser, ResolveData, Room, SERVER_clear_disconnect, SERVER_kick, SOCKET_flush_data, _, _async, addCallback, athleticChecker, auth, axios, badwords, ban_user, bunyan, challonge, challonge_cache, challonge_queue_callbacks, chat_color, checkFileExists, createDirectoryIfNotExists, crypto, dataManager, deck_name_match, dialogues, disconnect_list, exec, execFile, fs, geoip, getSeedTimet, get_callback, get_memory_usage, http, httpRequestListener, importOldConfig, import_datas, init, is_challonge_requesting, lflists, loadJSON, loadJSONAsync, loadLFList, loadRemoteData, load_dialogues, load_tips, log, long_resolve_cards, memory_usage, merge, moment, net, netRequestHandler, os, path, qs, real_windbot_server_ip, refresh_challonge_cache, release_disconnect, replaced_index, report_to_big_brother, request, roomlist, setting_change, setting_save, settings, spawn, spawnSync, spawn_windbot, tips, url, users_cache, util, wait_room_start, wait_room_start_arena, windbot_looplimit, windbot_process, windbots, ygopro, zlib;
var CLIENT_get_authorize_key, CLIENT_get_kick_reconnect_target, CLIENT_heartbeat_register, CLIENT_heartbeat_unregister, CLIENT_import_data, CLIENT_is_able_to_kick_reconnect, CLIENT_is_able_to_reconnect, CLIENT_is_banned_by_mc, CLIENT_is_player, CLIENT_kick, CLIENT_kick_reconnect, CLIENT_pre_reconnect, CLIENT_reconnect, CLIENT_reconnect_register, CLIENT_reconnect_unregister, CLIENT_send_pre_reconnect_info, CLIENT_send_reconnect_info, CLIENT_send_replays, Q, ROOM_all, ROOM_bad_ip, ROOM_ban_player, ROOM_clear_disconnect, ROOM_connected_ip, ROOM_find_by_name, ROOM_find_by_pid, ROOM_find_by_port, ROOM_find_by_title, ROOM_find_or_create_ai, ROOM_find_or_create_by_name, ROOM_find_or_create_random, ROOM_kick, ROOM_player_flee, ROOM_player_get_score, ROOM_player_lose, ROOM_player_win, ROOM_players_oppentlist, ROOM_players_scores, ROOM_unwelcome, ROOM_validate, ReplayParser, ResolveData, Room, SERVER_clear_disconnect, SERVER_kick, SOCKET_flush_data, _, _async, addCallback, athleticChecker, auth, axios, badwords, ban_user, bunyan, challonge, challonge_cache, challonge_queue_callbacks, checkFileExists, createDirectoryIfNotExists, crypto, dataManager, deck_name_match, dialogues, disconnect_list, exec, execFile, fs, geoip, getSeedTimet, get_callback, get_memory_usage, http, httpRequestListener, importOldConfig, import_datas, init, is_challonge_requesting, lflists, loadJSON, loadJSONAsync, loadLFList, loadRemoteData, load_dialogues, load_tips, log, long_resolve_cards, memory_usage, merge, moment, net, netRequestHandler, os, path, qs, real_windbot_server_ip, refresh_challonge_cache, release_disconnect, replaced_index, report_to_big_brother, request, roomlist, setting_change, setting_save, settings, spawn, spawnSync, spawn_windbot, tips, url, users_cache, util, wait_room_start, wait_room_start_arena, windbot_looplimit, windbot_process, windbots, ygopro, zlib;
net = require('net');
......@@ -202,8 +202,6 @@
badwords = null;
chat_color = null;
lflists = global.lflists = [];
real_windbot_server_ip = null;
......@@ -293,7 +291,7 @@
};
init = async function() {
var AthleticChecker, DataManager, challonge_module_name, challonge_type, config, cppversion, defaultConfig, default_data, dns, e, http_server, https, https_server, imported, j, l, len, len1, len2, m, mkdirList, options, pgClient, pg_client, pg_query, plugin_filename, plugin_list, plugin_path, postData, ref;
var AthleticChecker, DataManager, challonge_module_name, challonge_type, chat_color, config, cppversion, defaultConfig, default_data, dns, e, http_server, https, https_server, imported, j, l, len, len1, len2, m, mkdirList, options, pgClient, pg_client, pg_query, plugin_filename, plugin_list, plugin_path, postData, ref;
await createDirectoryIfNotExists("./config");
await importOldConfig();
defaultConfig = (await loadJSONAsync('./data/default_config.json'));
......@@ -398,6 +396,28 @@
if (imported) {
await setting_save(settings);
}
if (settings.modules.mysql.enabled) {
DataManager = require('./data-manager/DataManager.js').DataManager;
dataManager = global.dataManager = new DataManager(settings.modules.mysql.db, log);
await dataManager.init();
} else {
log.warn("Some functions may be limited without MySQL .");
if (settings.modules.cloud_replay.enabled) {
settings.modules.cloud_replay.enabled = false;
await setting_save(settings);
log.warn("Cloud replay cannot be enabled because no MySQL.");
}
if (settings.modules.enable_recover.enabled) {
settings.modules.enable_recover.enabled = false;
await setting_save(settings);
log.warn("Recover mode cannot be enabled because no MySQL.");
}
if (settings.modules.chat_color.enabled) {
settings.modules.chat_color.enabled = false;
await setting_save(settings);
log.warn("Chat color cannot be enabled because no MySQL.");
}
}
// 读取数据
default_data = (await loadJSONAsync('./data/default_data.json'));
try {
......@@ -418,12 +438,16 @@
badwords = global.badwords = default_data.badwords;
await setting_save(badwords);
}
if (settings.modules.chat_color.enabled) {
if (settings.modules.chat_color.enabled && (await checkFileExists('./config/chat_color.json'))) {
try {
chat_color = global.chat_color = (await loadJSONAsync('./config/chat_color.json'));
chat_color = (await loadJSONAsync('./config/chat_color.json'));
if (chat_color) {
await dataManager.migrateChatColors(chat_color.save_list);
await fs.promises.unlink('./config/chat_color.json');
log.info("Chat color migrated.");
}
} catch (error1) {
chat_color = global.chat_color = default_data.chat_color;
await setting_save(chat_color);
}
}
try {
......@@ -461,28 +485,6 @@
if (settings.modules.i18n.auto_pick) {
geoip = require('geoip-country-lite');
}
if (settings.modules.mysql.enabled) {
DataManager = require('./data-manager/DataManager.js').DataManager;
dataManager = global.dataManager = new DataManager(settings.modules.mysql.db, log);
await dataManager.init();
} else {
log.warn("Some functions may be limited without MySQL .");
if (settings.modules.cloud_replay.enabled) {
settings.modules.cloud_replay.enabled = false;
await setting_save(settings);
log.warn("Cloud replay cannot be enabled because no MySQL.");
}
if (settings.modules.enable_recover.enabled) {
settings.modules.enable_recover.enabled = false;
await setting_save(settings);
log.warn("Recover mode cannot be enabled because no MySQL.");
}
if (settings.modules.chat_color.enabled) {
settings.modules.chat_color.enabled = false;
await setting_save(settings);
log.warn("Chat color cannot be enabled because no MySQL.");
}
}
if (settings.modules.mycard.enabled) {
pgClient = require('pg').Client;
pg_client = global.pg_client = new pgClient(settings.modules.mycard.auth_database);
......@@ -4230,21 +4232,20 @@
}
}
} else if (cmsg.toLowerCase() === "default") {
chat_color.save_list[cip] = false;
setting_save(chat_color);
await dataManager.setUserChatColor(cip, null);
ygopro.stoc_send_chat(client, "${set_chat_color_default}", ygopro.constants.COLORS.BABYBLUE);
} else {
ccolor = cmsg.toUpperCase();
if (ygopro.constants.COLORS[ccolor] && ygopro.constants.COLORS[ccolor] > 10 && ygopro.constants.COLORS[ccolor] < 20) {
chat_color.save_list[cip] = ccolor;
setting_save(chat_color);
await dataManager.setUserChatColor(cip, ccolor);
ygopro.stoc_send_chat(client, "${set_chat_color_part1}" + ccolor + "${set_chat_color_part2}", ygopro.constants.COLORS.BABYBLUE);
} else {
ygopro.stoc_send_chat(client, "${color_not_found_part1}" + ccolor + "${color_not_found_part2}", ygopro.constants.COLORS.RED);
}
}
} else {
if (color = chat_color.save_list[cip]) {
color = (await dataManager.getUserChatColor(cip));
if (color) {
ygopro.stoc_send_chat(client, "${get_chat_color_part1}" + color + "${get_chat_color_part2}", ygopro.constants.COLORS.BABYBLUE);
} else {
ygopro.stoc_send_chat(client, "${get_chat_color_default}", ygopro.constants.COLORS.BABYBLUE);
......@@ -4656,7 +4657,7 @@
if (!tplayer) {
return;
}
tcolor = chat_color.save_list[CLIENT_get_authorize_key(tplayer)];
tcolor = (await dataManager.getUserChatColor(CLIENT_get_authorize_key(tplayer)));
if (tcolor) {
ygopro.stoc_send(client, 'CHAT', {
player: ygopro.constants.COLORS[tcolor],
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment