我正在处理一个包含列的 mysql 表 用户、频道、cowner1、cowner2、cowner3 等
将为 cowner1 和 cowner3 设置一个值,但 cowner 2 可以为空。
我想做的是当我更新列时(cowner[num]的最大值为7)我想选择该行中为空的第一列。
map() 似乎采用 null 并且不会添加键。我可能还需要更好的 mysql 调用,因为获取 cowner[num] 的查询是
select * from channels where user = "123"
来获取所有 cowner[num] 值。
我的大脑正在融化。我想避免编写 if 语句来查询每一列。有办法做到吗?
如有任何帮助,我们将不胜感激。
import {
Client,
GuildChannel,
GuildMember,
ChannelType,
Message,
ChannelManager,
EmbedBuilder,
MessageMentions,
} from "discord.js";
import { CommandTypes, PrefixCommandModule } from "../../handler/types/Command";
const {
addcowner,
getisland,
adduser,
addedusers,
removeban,
} = require("~/extras/functions");
export = {
name: "addcowner",
aliases: ["Addcowner", "addowner", "addco"],
type: CommandTypes.PrefixCommand,
channelWhitelist: ["1147233774938107966"],
ownerOnly: true,
async execute(message: Message): Promise<void> {
if (message.channel.type !== ChannelType.GuildText) return;
if (!message.mentions.users.map((m) => m).length) {
await message.reply("Did you forget to add the user?");
return;
}
const id = await message.mentions.users.first().id;
const cleanid = await id.replace(/\D/g, "");
const checkAdds = await addedusers(message.channel.id);
const channelInfo = getisland(message.channel.id);
const isAdded = checkAdds.some((added) => added.user === cleanid);
const cownersArray = [
channelInfo.cowner1,
channelInfo.cowner2,
channelInfo.cowner3,
channelInfo.cowner4,
channelInfo.cowner5,
channelInfo.cowner6,
channelInfo.cowner7,
];
const filteredOwners: string[] = cownersArray.filter(
(s): s is string => !!s,
);
const cownersMap = new Map();
let cowners = " ";
let addlist = " ";
let cownerNum = cownersMap.size;
if (id === message.author.id) {
await message.reply("Seriously? <a:ep_bozabonk:1164312811468496916>");
return;
}
if (!isAdded) {
await adduser(cleanid, message.channel.id);
await message.channel.permissionOverwrites.edit(cleanid, {
ViewChannel: true,
SendMessages: true,
});
}
for (let i = 0; i < cownersArray.length; i++) {
await cownersMap.set(`${cownersArray[i]}`, i + 1);
}
if (cownersMap.has(cleanid)) {
await message.reply("user is already a cowner");
return;
} else if (cownerNum >= 7) {
await message.reply(
"Maximum Cowners is 7. Please use `ep remuser` to make room",
);
return;
} else if (cownersMap.get(null) !== undefined) {
cownerNum = cownersMap.get(null);
await addcowner(message.channel.id, cownerNum, cleanid);
await message.channel.permissionOverwrites.edit(cleanid, {
ViewChannel: true,
SendMessages: true,
});
}
for (let i = 0; i < filteredOwners.length; i++) {
cowners = await cowners.concat(`\n> ${i + 1}. <@!${filteredOwners[i]}>`);
}
let embed1 = new EmbedBuilder()
.setTitle("Channel Manager: Add CO-owner")
.setDescription(
`__Current List of C0-owners Users__
${cowners}\n
*to remove a cowner, use command ep remcowner*`,
)
.setColor(`#097969`);
await message.reply({ embeds: [embed1] });
},
} as PrefixCommandModule;
--- Mysql 调用 ---
function getislands() {
return new Promise((resolve) => {
con.query(`SELECT * FROM channels`, function (err, result) {
if (err) throw err;
if (result.length) return resolve(result);
return resolve(false);
});
});
}
function adduser(user, channel) {
return new Promise((resolve) => {
con.query(
`INSERT INTO added (user, channel) VALUES ('${user}', '${channel}')`,
function (err, result) {
if (err) throw err;
resolve("done");
},
);
});
}
function addcowner(channel, number, cowner) {
return new Promise((resolve) => {
con.query(
`UPDATE channels SET cowner${number} = '${cowner}' WHERE channel = '${channel}'`,
function (err, result) {
if (err) throw err;
resolve("added!");
},
);
});
}
function addedusers(channel) {
return new Promise((resolve) => {
con.query(
`SELECT * FROM added WHERE channel = '${channel}'`,
function (err, result) {
if (err) throw err;
// resolve(JSON.parse(JSON.stringify(result[0])))
resolve(result);
},
);
});
}
Mysql 列
田野 | 类型 | 空 | 钥匙 | 默认 | 额外 |
---|---|---|---|---|---|
用户 | varchar(50) | 是 | 空 | ||
频道 | varchar(50) | 是 | 空 | ||
cowner1 | varchar(50) | 是 | 空 | ||
cowner2 | varchar(50) | 是 | 空 | ||
cowner3 | varchar(50) | 是 | 空 | ||
cowner4 | varchar(50) | 是 | 空 | ||
cowner5 | varchar(50) | 是 | 空 | ||
cowner6 | varchar(50) | 是 | 空 | ||
cowner7 | varchar(50) | 是 | 空 | ||
管理员1 | varchar(50) | 是 | 940093840184975460 | ||
管理员2 | varchar(50) | 是 | 936693149114449921 | ||
管理员3 | varchar(50) | 是 | 487632896899940356 | ||
管理员4 | varchar(50) | 是 | 641203935977144340 | ||
管理员5 | varchar(50) | 是 | 710140067951149077 | ||
管理员6 | varchar(50) | 是 | 空 | ||
管理员7 | varchar(50) | 是 | 空 | ||
staff_grp | varchar(50) | 是 | 1136168655172947988 | ||
活动 | 小int(1) | 是 | 空 |
没有错误可提供。这是一个关于如何实现上述的逻辑问题。
通过使用 Object.entries 将该字符串转换为对象,以及不幸的是一些 if 语句,我能够获取所有值,包括 null。
Object.entries(channelInfo).forEach(([key, value]) => {
cowners = cowners.concat(`${key}:${value},`)
});
let cownersTemp = cowners.split(",")
.map(pair => pair.split(":"));
const result = Object.fromEntries(cownersTemp);
function getOwner(obj, value) {
return Object.keys(obj)
.filter(key => obj[key] === value);
}
if(result.cowner1, result.cowner2, result.cowner3, result.cowner4, result.cowner5, result.cowner6, result.cowner7 === cleanid){
message.reply("user is already a cowner")
}else if(result.cowner1, result.cowner2, result.cowner3, result.cowner4, result.cowner5, result.cowner6, result.cowner7 !== cleanid) {
let availableSpot = getOwner(result, 'null')
if(!availableSpot[0]) {
message.reply("You have maxed out available cowners. Remove a cowner to make room")
return;
}else{
insertcowner(message.channel.id, `${availableSpot[0]}`, cleanid)
}
}else{
message.reply("something happened. contact an admin")
return;
}