244 lines
7.0 KiB
JavaScript
244 lines
7.0 KiB
JavaScript
const Code = require("../lib/code");
|
|
const { query_guild } = require("../lib/db");
|
|
const userDao = require("./userDao");
|
|
|
|
class GuildDao {
|
|
async listGuild() {
|
|
const ql = "SELECT idx, gname FROM t_guilds";
|
|
const rl = await query_guild(ql);
|
|
return rl;
|
|
}
|
|
|
|
async createGuild(gName, uId) {
|
|
const egId = await this.getGuildIdByUID(uId);
|
|
if (egId) {
|
|
const err = new Error();
|
|
err.code = Code.GUILD.FA_GUILD_CREATE_FAILED;
|
|
err.msg = "The player has already joined the guild";
|
|
throw err;
|
|
}
|
|
|
|
const qcg = `INSERT INTO t_guilds (gname, gowner) VALUES (?, ?)`;
|
|
const rcg = await query_guild(qcg, [gName, uId]);
|
|
if (rcg) {
|
|
if (await this.insertGuildMember(rcg.insertId, uId, 10, 2)) {
|
|
return rcg.insertId;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
async getGuildIdByUID(uId) {
|
|
const qg = `SELECT guild_idx FROM t_guild_members WHERE uid=? AND apply=2`;
|
|
const rg = await query_guild(qg, [uId]);
|
|
if (rg && rg.length > 0) {
|
|
return rg[0].guild_idx;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
async getGuild(gId) {
|
|
const qgg = `SELECT * FROM t_guilds WHERE idx=?`;
|
|
const rgg = await query_guild(qgg, [gId]);
|
|
if (rgg) {
|
|
return rgg[0];
|
|
}
|
|
return null;
|
|
}
|
|
|
|
async joinGuild(gId, uId) {
|
|
return await this.insertGuildMember(gId, uId, 0, 0);
|
|
}
|
|
|
|
async approveGuild(gId, uId, nuId) {
|
|
return await this.approveGuildMember(gId, uId, nuId);
|
|
}
|
|
|
|
async inviteNewMember(gId, uId, nuId) {
|
|
const qmi = "SELECT * FROM t_guild_members where uid=?";
|
|
const rmi = await query_guild(qmi, [uId]);
|
|
if (rmi && rmi.length > 0) {
|
|
if (rmi[0].guild_idx == gId && rmi[0].g_rank >= 5) {
|
|
const rnUser = await userDao.get(nuId);
|
|
if (rnUser) {
|
|
return await this.insertGuildMember(gId, nuId, 0, 1);
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* 获取指定公会成员列表
|
|
*
|
|
* @param {int} guildId
|
|
* @param {int} apply 0-正在申请加入 2-已经通过申请成为正式成员
|
|
* @returns 工会成员列表或申请列表
|
|
*/
|
|
async getGuildMembers(guildId, apply) {
|
|
const query = "SELECT * FROM t_guild_members WHERE guild_idx=? AND apply=?";
|
|
const r = await query_guild(query, [guildId, apply]);
|
|
if (r && r.length > 0) {
|
|
return r;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
async getInviteList(uId) {
|
|
const qil = "SELECT idx, guild_idx FROM t_guild_members WHERE uid=? AND apply=1";
|
|
const ril = await query_guild(qil, [uId]);
|
|
if (ril) {
|
|
return ril;
|
|
}
|
|
return [];
|
|
}
|
|
|
|
async confirmInvite(gId, uId) {
|
|
const qci =
|
|
"SELECT * FROM t_guild_members WHERE guild_idx=? AND uid=? AND apply=1";
|
|
const rci = await query_guild(qci, [gId, uId]);
|
|
if (rci && rci.length > 0) {
|
|
const quA = "UPDATE t_guild_members SET apply=? WHERE idx=?";
|
|
const ruA = await query_guild(quA, [2, rci[0].idx]);
|
|
if (ruA) {
|
|
const qdI = "DELETE FROM t_guild_members WHERE uid=? AND apply=1";
|
|
const rdI = await query_guild(qdI, [uId]);
|
|
if (rdI) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
async leaveGuild(uId) {
|
|
const qfm = "SELECT * FROM t_guild_members WHERE uid=? AND apply=2";
|
|
const rfm = await query_guild(qfm, [uId]);
|
|
if (rfm && rfm.length > 0) {
|
|
return await this.deleteGuildMember(rfm[0].guild_idx, uId);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
async kick(uId, mId) {
|
|
const ql = "SELECT * FROM t_guild_members WHERE uid=?";
|
|
const rl = await query_guild(ql, [uId]);
|
|
if (rl && rl.length > 0) {
|
|
const qfm = "SELECT * FROM t_guild_members WHERE uid=? AND apply=2";
|
|
const rfm = await query_guild(qfm, [mId]);
|
|
if (
|
|
rfm &&
|
|
rfm.length > 0 &&
|
|
rl[0].guild_idx == rfm[0].guild_idx &&
|
|
rl[0].g_rank >= 5 &&
|
|
rl[0].g_rank > rfm[0].g_rank
|
|
) {
|
|
return await this.deleteGuildMember(rfm[0].guild_idx, mId);
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
async updateMemberRank(guildId, leaderUid, memberUid, newRank) {
|
|
const validRanks = [0, 5];
|
|
if (!validRanks.includes(newRank)) {
|
|
throw new Error("Invalid rank value.");
|
|
}
|
|
|
|
const leaderInfo = await this.getMemberInfo(guildId, leaderUid);
|
|
const memberInfo = await this.getMemberInfo(guildId, memberUid);
|
|
|
|
if (
|
|
leaderInfo &&
|
|
leaderInfo.g_rank === 10 &&
|
|
memberInfo &&
|
|
memberInfo.apply === 2
|
|
) {
|
|
const query =
|
|
"UPDATE t_guild_members SET g_rank = ? WHERE guild_idx = ? AND uid = ?";
|
|
const result = await query_guild(query, [newRank, guildId, memberUid]);
|
|
return result && result.affectedRows > 0;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
async setAnnounce(gId, uId, announce) {
|
|
const memberInfo = await this.getMemberInfo(gId, uId);
|
|
if (memberInfo && memberInfo.g_rank >= 5) {
|
|
const query = "UPDATE t_guilds SET announce = ? WHERE idx = ?";
|
|
const result = await query_guild(query, [announce, gId]);
|
|
return result && result.affectedRows > 0;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
async disbandGuild(uId) {
|
|
const ql = "SELECT * FROM t_guild_members WHERE uid=? AND g_rank=10";
|
|
const rl = await query_guild(ql, [uId]);
|
|
if (rl && rl.length > 0) {
|
|
const gId = rl[0].guild_idx;
|
|
|
|
const qdm = "DELETE FROM t_guild_members WHERE guild_idx=?";
|
|
await query_guild(qdm, [gId]);
|
|
|
|
const qdg = "DELETE FROM t_guilds WHERE idx=?";
|
|
const rdg = await query_guild(qdg, [gId]);
|
|
|
|
return rdg != null;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
// 插入公会成员
|
|
// gId 公会id
|
|
// uId 用户id
|
|
// rank 成员等级
|
|
// state 申请状态 0-未通过 1-被邀请 2-已通过
|
|
async insertGuildMember(gId, uId, rank, state) {
|
|
const qfm = "SELECT * FROM t_guild_members where uid=?";
|
|
const rfm = await query_guild(qfm, [uId]);
|
|
if (rfm) {
|
|
if (rfm.length > 0) {
|
|
if (rfm.some((item) => item.apply === 2)) {
|
|
return false;
|
|
}
|
|
if (rfm.some((item) => item.guild_idx === gId)) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
const qim =
|
|
"INSERT INTO t_guild_members (guild_idx, uid, g_rank, apply) VALUES (?, ?, ?, ?)";
|
|
const rim = await query_guild(qim, [gId, uId, rank, state]);
|
|
return rim != null;
|
|
}
|
|
|
|
async approveGuildMember(gId, uId, nuId) {
|
|
const qfl = "SELECT * FROM t_guild_members WHERE uid=?";
|
|
const rfl = await query_guild(qfl, [uId]);
|
|
if (rfl && rfl.length > 0) {
|
|
if (rfl[0].g_rank === 10 && rfl[0].guild_idx == gId) {
|
|
const qfnm =
|
|
"SELECT * FROM t_guild_members WHERE uid=? AND guild_idx=?";
|
|
const rfnm = await query_guild(qfnm, [nuId, gId]);
|
|
if (rfnm && rfnm.length > 0) {
|
|
const quA = "UPDATE t_guild_members SET apply=? WHERE idx=?";
|
|
const ruA = await query_guild(quA, [2, rfnm[0].idx]);
|
|
return ruA != null;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
async getMemberInfo(guildId, uid) {
|
|
const query =
|
|
"SELECT * FROM t_guild_members WHERE guild_idx = ? AND uid = ? AND apply = 2";
|
|
const result = await query_guild(query, [guildId, uid]);
|
|
return result && result.length > 0 ? result[0] : null;
|
|
}
|
|
}
|
|
|
|
module.exports = new GuildDao();
|