Merge branch 'dev' into 'main'

Dev

See merge request illegitimate/illegitimate-bot!319
This commit is contained in:
2024-12-29 18:10:47 +00:00
12 changed files with 115 additions and 258 deletions

View File

@@ -3,6 +3,7 @@ import { getVerify } from "src/drizzle/functions.js"
import { devMessage, embedColor, hypixelGuildID } from "~/config/options.js" import { devMessage, embedColor, hypixelGuildID } from "~/config/options.js"
import { waitingListRole } from "~/config/roles.js" import { waitingListRole } from "~/config/roles.js"
import { IContextMenu } from "~/interfaces" import { IContextMenu } from "~/interfaces"
import getGuildRank from "~/utils/Functions/guildrank.js"
import roleManage from "~/utils/Functions/rolesmanage.js" import roleManage from "~/utils/Functions/rolesmanage.js"
import { getGuild, getHeadURL, getIGN } from "~/utils/Hypixel.js" import { getGuild, getHeadURL, getIGN } from "~/utils/Hypixel.js"
@@ -102,55 +103,16 @@ export default {
const guildRank = GuildMembers.find(member => member.uuid === verifyData.uuid)!.rank const guildRank = GuildMembers.find(member => member.uuid === verifyData.uuid)!.rank
let replyRank: string | null = null let replyRank: string | null = null
const rank = getGuildRank(guildRank)
if (rank) {
await user.roles.remove(rank.rolesToRemove, "User was force updated.")
await user.roles.add(rank.rolesToAdd, "User was force updated.")
replyRank = rank.rank
}
await user.roles.remove(waitingListRole, "User was force updated.")
await user.roles.add(roleManage("default").rolesToAdd, "User was force updated.") await user.roles.add(roleManage("default").rolesToAdd, "User was force updated.")
if (guildRank === "Guild Master") {
const roles = roleManage("gm")
await user.roles.remove(roles.rolesToRemove, "User was force updated.")
await user.roles.add(roles.rolesToAdd, "User was force updated.")
replyRank = "Guild Master"
}
if (guildRank === "Manager") {
const roles = roleManage("manager")
await user.roles.remove(roles.rolesToRemove, "User was force updated.")
await user.roles.add(roles.rolesToAdd, "User was force updated.")
replyRank = "Manager"
}
if (guildRank === "Moderator") {
const roles = roleManage("moderator")
await user.roles.remove(roles.rolesToRemove, "User was force updated.")
await user.roles.add(roles.rolesToAdd, "User was force updated.")
replyRank = "Moderator"
}
if (guildRank === "Beast") {
const roles = roleManage("beast")
await user.roles.remove(roles.rolesToRemove, "User was force updated.")
await user.roles.add(roles.rolesToAdd, "User was force updated.")
replyRank = "Beast"
}
if (guildRank === "Elite") {
const roles = roleManage("elite")
await user.roles.remove(roles.rolesToRemove, "User was force updated.")
await user.roles.add(roles.rolesToAdd, "User was force updated.")
replyRank = "Elite"
}
if (guildRank === "Member") {
const roles = roleManage("member")
await user.roles.remove(roles.rolesToRemove, "User was force updated.")
await user.roles.add(roles.rolesToAdd, "User was force updated.")
replyRank = "Member"
}
// FIXME: check if user is on waiting list
if (user.roles.cache.has(waitingListRole)) {
await user.roles.remove(waitingListRole, "User was force updated.")
}
await user.setNickname(ign, "User was force updated.").catch(() => { await user.setNickname(ign, "User was force updated.").catch(() => {
// Do nothing // Do nothing
}) })

View File

@@ -3,6 +3,7 @@ import { getVerify } from "src/drizzle/functions.js"
import { devMessage, embedColor, hypixelGuildID } from "~/config/options.js" import { devMessage, embedColor, hypixelGuildID } from "~/config/options.js"
import { waitingListRole } from "~/config/roles.js" import { waitingListRole } from "~/config/roles.js"
import { ICommand } from "~/interfaces" import { ICommand } from "~/interfaces"
import getGuildRank from "~/utils/Functions/guildrank.js"
import roleManage from "~/utils/Functions/rolesmanage.js" import roleManage from "~/utils/Functions/rolesmanage.js"
import { getGuild, getHeadURL, getIGN } from "~/utils/Hypixel.js" import { getGuild, getHeadURL, getIGN } from "~/utils/Hypixel.js"
@@ -107,51 +108,15 @@ export default {
const guildRank = GuildMembers.find(member => member.uuid === verifyData.uuid)!.rank const guildRank = GuildMembers.find(member => member.uuid === verifyData.uuid)!.rank
let replyRank: string | null = null let replyRank: string | null = null
await user.roles.add(roleManage("default").rolesToAdd, "User was force updated.") const rank = getGuildRank(guildRank)
if (rank) {
if (guildRank === "Guild Master") { await user.roles.remove(rank.rolesToRemove, "User was force updated.")
const roles = roleManage("gm") await user.roles.add(rank.rolesToAdd, "User was force updated.")
await user.roles.remove(roles.rolesToRemove, "User was force updated.") replyRank = rank.rank
await user.roles.add(roles.rolesToAdd, "User was force updated.")
replyRank = "Guild Master"
}
if (guildRank === "Manager") {
const roles = roleManage("manager")
await user.roles.remove(roles.rolesToRemove, "User was force updated.")
await user.roles.add(roles.rolesToAdd, "User was force updated.")
replyRank = "Manager"
}
if (guildRank === "Moderator") {
const roles = roleManage("moderator")
await user.roles.remove(roles.rolesToRemove, "User was force updated.")
await user.roles.add(roles.rolesToAdd, "User was force updated.")
replyRank = "Moderator"
}
if (guildRank === "Beast") {
const roles = roleManage("beast")
await user.roles.remove(roles.rolesToRemove, "User was force updated.")
await user.roles.add(roles.rolesToAdd, "User was force updated.")
replyRank = "Beast"
}
if (guildRank === "Elite") {
const roles = roleManage("elite")
await user.roles.remove(roles.rolesToRemove, "User was force updated.")
await user.roles.add(roles.rolesToAdd, "User was force updated.")
replyRank = "Elite"
}
if (guildRank === "Member") {
const roles = roleManage("member")
await user.roles.remove(roles.rolesToRemove, "User was force updated.")
await user.roles.add(roles.rolesToAdd, "User was force updated.")
replyRank = "Member"
} }
await user.roles.remove(waitingListRole, "User was force updated.") await user.roles.remove(waitingListRole, "User was force updated.")
await user.roles.add(roleManage("default").rolesToAdd, "User was force updated.")
await user.setNickname(ign, "User was force updated.").catch(() => { await user.setNickname(ign, "User was force updated.").catch(() => {
// Do nothing // Do nothing
}) })

View File

@@ -2,6 +2,7 @@ import { GuildMember, InteractionContextType, PermissionFlagsBits, SlashCommandB
import { addVerify, getVerify } from "src/drizzle/functions.js" import { addVerify, getVerify } from "src/drizzle/functions.js"
import { devMessage, embedColor, hypixelGuildID } from "~/config/options.js" import { devMessage, embedColor, hypixelGuildID } from "~/config/options.js"
import { ICommand } from "~/interfaces" import { ICommand } from "~/interfaces"
import getGuildRank from "~/utils/Functions/guildrank.js"
import logToChannel from "~/utils/Functions/logtochannel.js" import logToChannel from "~/utils/Functions/logtochannel.js"
import roleManage from "~/utils/Functions/rolesmanage.js" import roleManage from "~/utils/Functions/rolesmanage.js"
import { getGuild, getHeadURL, getPlayer, getUUID } from "~/utils/Hypixel.js" import { getGuild, getHeadURL, getPlayer, getUUID } from "~/utils/Hypixel.js"
@@ -102,34 +103,9 @@ export default {
const GuildMembers = guild!.members const GuildMembers = guild!.members
const guildRank = GuildMembers.find(member => member.uuid === player.uuid)!.rank const guildRank = GuildMembers.find(member => member.uuid === player.uuid)!.rank
if (guildRank === "Guild Master") { const rank = getGuildRank(guildRank)
const roles = roleManage("gm") if (rank) {
await user.roles.add(roles.rolesToAdd, "User was force verified by " + modName) await user.roles.add(rank.rolesToAdd, "User was force verified by " + modName)
}
if (guildRank === "Manager") {
const roles = roleManage("manager")
await user.roles.add(roles.rolesToAdd, "User was force verified by " + modName)
}
if (guildRank === "Moderator") {
const roles = roleManage("moderator")
await user.roles.add(roles.rolesToAdd, "User was force verified by " + modName)
}
if (guildRank === "Beast") {
const roles = roleManage("beast")
await user.roles.add(roles.rolesToAdd, "User was force verified by " + modName)
}
if (guildRank === "Elite") {
const roles = roleManage("elite")
await user.roles.add(roles.rolesToAdd, "User was force verified by " + modName)
}
if (guildRank === "Member") {
const roles = roleManage("member")
await user.roles.add(roles.rolesToAdd, "User was force verified by " + modName)
} }
} }

View File

@@ -3,6 +3,7 @@ import { getVerifies } from "src/drizzle/functions.js"
import { embedColor, hypixelGuildID } from "~/config/options.js" import { embedColor, hypixelGuildID } from "~/config/options.js"
import { IGuildData } from "~/interfaces" import { IGuildData } from "~/interfaces"
import env from "~/utils/Env.js" import env from "~/utils/Env.js"
import getGuildRank from "~/utils/Functions/guildrank.js"
import roleManage from "~/utils/Functions/rolesmanage.js" import roleManage from "~/utils/Functions/rolesmanage.js"
import { getGuild, getIGN } from "~/utils/Hypixel.js" import { getGuild, getIGN } from "~/utils/Hypixel.js"
import { log } from "~/utils/Logger.js" import { log } from "~/utils/Logger.js"
@@ -94,30 +95,10 @@ export default async function updateAll(interaction: ChatInputCommandInteraction
const guildMemberRank = hypixelGuildMembers.find(gmember => gmember.uuid === memberData!.uuid)!.rank const guildMemberRank = hypixelGuildMembers.find(gmember => gmember.uuid === memberData!.uuid)!.rank
log(" Updating roles for " + gmember.member.user.username, "info", { type: "preset", color: "lavender" }) log(" Updating roles for " + gmember.member.user.username, "info", { type: "preset", color: "lavender" })
if (guildMemberRank === "Guild Master") { const rank = getGuildRank(guildMemberRank)
const rolesmanage = roleManage("gm") if (rank) {
gmember.member.roles.remove(rolesmanage.rolesToRemove, "Updating all discord members") await gmember.member.roles.remove(rank.rolesToRemove, "Updating all discord members")
gmember.member.roles.add(rolesmanage.rolesToAdd, "Updating all discord members") await gmember.member.roles.add(rank.rolesToAdd, "Updating all discord members")
} else if (guildMemberRank === "Manager") {
const rolesmanage = roleManage("manager")
gmember.member.roles.remove(rolesmanage.rolesToRemove, "Updating all discord members")
gmember.member.roles.add(rolesmanage.rolesToAdd, "Updating all discord members")
} else if (guildMemberRank === "Moderator") {
const rolesmanage = roleManage("moderator")
gmember.member.roles.remove(rolesmanage.rolesToRemove, "Updating all discord members")
gmember.member.roles.add(rolesmanage.rolesToAdd, "Updating all discord members")
} else if (guildMemberRank === "Beast") {
const rolesmanage = roleManage("beast")
gmember.member.roles.remove(rolesmanage.rolesToRemove, "Updating all discord members")
gmember.member.roles.add(rolesmanage.rolesToAdd, "Updating all discord members")
} else if (guildMemberRank === "Elite") {
const rolesmanage = roleManage("elite")
gmember.member.roles.remove(rolesmanage.rolesToRemove, "Updating all discord members")
gmember.member.roles.add(rolesmanage.rolesToAdd, "Updating all discord members")
} else if (guildMemberRank === "Member") {
const rolesmanage = roleManage("member")
gmember.member.roles.remove(rolesmanage.rolesToRemove, "Updating all discord members")
gmember.member.roles.add(rolesmanage.rolesToAdd, "Updating all discord members")
} }
} }
await gmember.member.setNickname(ign, "Updating all discord members").catch(() => { await gmember.member.setNickname(ign, "Updating all discord members").catch(() => {

View File

@@ -3,6 +3,7 @@ import { getVerify } from "src/drizzle/functions.js"
import { devMessage, embedColor, hypixelGuildID } from "~/config/options.js" import { devMessage, embedColor, hypixelGuildID } from "~/config/options.js"
import { waitingListRole } from "~/config/roles.js" import { waitingListRole } from "~/config/roles.js"
import { ICommand } from "~/interfaces" import { ICommand } from "~/interfaces"
import getGuildRank from "~/utils/Functions/guildrank.js"
import roleManage from "~/utils/Functions/rolesmanage.js" import roleManage from "~/utils/Functions/rolesmanage.js"
import { getGuild, getHeadURL, getIGN } from "~/utils/Hypixel.js" import { getGuild, getHeadURL, getIGN } from "~/utils/Hypixel.js"
@@ -90,52 +91,15 @@ export default {
const guildRank = GuildMembers.find(member => member.uuid === verifyData.uuid)!.rank const guildRank = GuildMembers.find(member => member.uuid === verifyData.uuid)!.rank
let replyRank: string | null = null let replyRank: string | null = null
await user.roles.add(roleManage("default").rolesToAdd, "User used the update command") const rank = getGuildRank(guildRank)
if (rank) {
if (guildRank === "Guild Master") { await user.roles.remove(rank.rolesToRemove, "User used the update command")
const roles = roleManage("gm") await user.roles.add(rank.rolesToAdd, "User used the update command")
await user.roles.remove(roles.rolesToRemove, "User used the update command") replyRank = rank.rank
await user.roles.add(roles.rolesToAdd, "User used the update command")
replyRank = "Guild Master"
}
if (guildRank === "Manager") {
const roles = roleManage("manager")
await user.roles.remove(roles.rolesToRemove, "User used the update command")
await user.roles.add(roles.rolesToAdd, "User used the update command")
replyRank = "Manager"
}
if (guildRank === "Moderator") {
const roles = roleManage("moderator")
await user.roles.remove(roles.rolesToRemove, "User used the update command")
await user.roles.add(roles.rolesToAdd, "User used the update command")
replyRank = "Moderator"
}
if (guildRank === "Beast") {
const roles = roleManage("beast")
await user.roles.remove(roles.rolesToRemove, "User used the update command")
await user.roles.add(roles.rolesToAdd, "User used the update command")
replyRank = "Beast"
}
if (guildRank === "Elite") {
const roles = roleManage("elite")
await user.roles.remove(roles.rolesToRemove, "User used the update command")
await user.roles.add(roles.rolesToAdd, "User used the update command")
replyRank = "Elite"
}
if (guildRank === "Member") {
const roles = roleManage("member")
await user.roles.remove(roles.rolesToRemove, "User used the update command")
await user.roles.add(roles.rolesToAdd, "User used the update command")
replyRank = "Member"
} }
await user.roles.remove(waitingListRole, "User used the update command") await user.roles.remove(waitingListRole, "User used the update command")
await user.roles.add(roleManage("default").rolesToAdd, "User used the update command")
await user.setNickname(ign, "Verification").catch(() => { await user.setNickname(ign, "Verification").catch(() => {
// Do nothing // Do nothing
}) })

View File

@@ -4,6 +4,7 @@ import { devMessage, embedColor, hypixelGuildID } from "~/config/options.js"
import { ICommand } from "~/interfaces" import { ICommand } from "~/interfaces"
import { IPlayerData } from "~/interfaces" import { IPlayerData } from "~/interfaces"
import { IGuildData } from "~/interfaces" import { IGuildData } from "~/interfaces"
import getGuildRank from "~/utils/Functions/guildrank.js"
import roleManage from "~/utils/Functions/rolesmanage.js" import roleManage from "~/utils/Functions/rolesmanage.js"
import { getGuild, getHeadURL, getPlayer, getUUID } from "~/utils/Hypixel.js" import { getGuild, getHeadURL, getPlayer, getUUID } from "~/utils/Hypixel.js"
@@ -127,34 +128,9 @@ export default {
const GuildMembers = guild!.members const GuildMembers = guild!.members
const guildRank = GuildMembers.find(member => member.uuid === player.uuid)!.rank const guildRank = GuildMembers.find(member => member.uuid === player.uuid)!.rank
if (guildRank === "Guild Master") { const rank = getGuildRank(guildRank)
const roles = roleManage("gm") if (rank) {
await user.roles.add(roles.rolesToAdd, "Verification") await user.roles.add(rank.rolesToAdd, "Verification")
}
if (guildRank === "Manager") {
const roles = roleManage("manager")
await user.roles.add(roles.rolesToAdd, "Verification")
}
if (guildRank === "Moderator") {
const roles = roleManage("moderator")
await user.roles.add(roles.rolesToAdd, "Verification")
}
if (guildRank === "Beast") {
const roles = roleManage("beast")
await user.roles.add(roles.rolesToAdd, "Verification")
}
if (guildRank === "Elite") {
const roles = roleManage("elite")
await user.roles.add(roles.rolesToAdd, "Verification")
}
if (guildRank === "Member") {
const roles = roleManage("member")
await user.roles.add(roles.rolesToAdd, "Verification")
} }
} }

View File

@@ -2,10 +2,10 @@ import { ActionRowBuilder, ButtonBuilder, ButtonStyle, GuildMember, TextChannel
import { ignM, largeM, smallM } from "~/config/limitmessages.js" import { ignM, largeM, smallM } from "~/config/limitmessages.js"
import { embedColor, inactivityLogChannel } from "~/config/options.js" import { embedColor, inactivityLogChannel } from "~/config/options.js"
import { inactivity } from "~/config/questions.js" import { inactivity } from "~/config/questions.js"
import { beast, gm, guildRole, guildStaff, manager, member, moderator } from "~/config/roles.js" import { beast, gm, guildRole, guildStaff, leader, member, staff } from "~/config/roles.js"
import { IButton } from "~/interfaces" import { IButton } from "~/interfaces"
import applicationQuestions from "~/utils/Functions/applicationquestions.js" import applicationQuestions from "~/utils/Functions/applicationquestions.js"
const guildRoles = [gm, manager, moderator, beast, member, guildStaff, guildRole] const guildRoles = [gm, leader, staff, beast, member, guildStaff, guildRole]
export default { export default {
name: "guildinactivitylog", name: "guildinactivitylog",

View File

@@ -2,6 +2,7 @@ import { GuildMember } from "discord.js"
import { addVerify, getVerify } from "src/drizzle/functions.js" import { addVerify, getVerify } from "src/drizzle/functions.js"
import { devMessage, embedColor, hypixelGuildID } from "~/config/options.js" import { devMessage, embedColor, hypixelGuildID } from "~/config/options.js"
import { IModal } from "~/interfaces" import { IModal } from "~/interfaces"
import getGuildRank from "~/utils/Functions/guildrank.js"
import roleManage from "~/utils/Functions/rolesmanage.js" import roleManage from "~/utils/Functions/rolesmanage.js"
import { getGuild, getHeadURL, getPlayer, getUUID } from "~/utils/Hypixel.js" import { getGuild, getHeadURL, getPlayer, getUUID } from "~/utils/Hypixel.js"
@@ -109,34 +110,9 @@ export default {
const GuildMembers = guild!.members const GuildMembers = guild!.members
const guildRank = GuildMembers.find(member => member.uuid === player.uuid)!.rank const guildRank = GuildMembers.find(member => member.uuid === player.uuid)!.rank
if (guildRank === "Guild Master") { const rank = getGuildRank(guildRank)
const roles = roleManage("gm") if (rank) {
await user.roles.add(roles.rolesToAdd, "Verification") await user.roles.add(rank.rolesToAdd, "Verification")
}
if (guildRank === "Manager") {
const roles = roleManage("manager")
await user.roles.add(roles.rolesToAdd, "Verification")
}
if (guildRank === "Moderator") {
const roles = roleManage("moderator")
await user.roles.add(roles.rolesToAdd, "Verification")
}
if (guildRank === "Beast") {
const roles = roleManage("beast")
await user.roles.add(roles.rolesToAdd, "Verification")
}
if (guildRank === "Elite") {
const roles = roleManage("elite")
await user.roles.add(roles.rolesToAdd, "Verification")
}
if (guildRank === "Member") {
const roles = roleManage("member")
await user.roles.add(roles.rolesToAdd, "Verification")
} }
await user.roles.add(roleManage("default").rolesToAdd, "Verification") await user.roles.add(roleManage("default").rolesToAdd, "Verification")

View File

@@ -1,6 +1,6 @@
const gm = "815893218246787080" const gm = "815893218246787080"
const manager = "815880752683679824" const leader = "815880752683679824"
const moderator = "815880910019887134" const staff = "815880910019887134"
const elite = "1137654165884129310" const elite = "1137654165884129310"
const beast = "815880942345519104" const beast = "815880942345519104"
const member = "815880984301404190" const member = "815880984301404190"
@@ -24,10 +24,10 @@ export {
guildRole, guildRole,
guildStaff, guildStaff,
helper, helper,
manager, leader,
member, member,
moderator,
muted, muted,
staff,
verifyTick, verifyTick,
waitingListRole waitingListRole
} }

View File

@@ -0,0 +1,57 @@
import roleManage from "./rolesmanage.js"
export default function getGuildRank(rank: string) {
if (rank === "Guild Master") {
const roles = roleManage("gm")
return {
rolesToRemove: roles.rolesToRemove,
rolesToAdd: roles.rolesToAdd,
rank: "Guild Master"
}
}
if (rank === "Leader") {
const roles = roleManage("leader")
return {
rolesToRemove: roles.rolesToRemove,
rolesToAdd: roles.rolesToAdd,
rank: "Leader"
}
}
if (rank === "Staff") {
const roles = roleManage("staff")
return {
rolesToRemove: roles.rolesToRemove,
rolesToAdd: roles.rolesToAdd,
rank: "Staff"
}
}
if (rank === "Beast") {
const roles = roleManage("beast")
return {
rolesToRemove: roles.rolesToRemove,
rolesToAdd: roles.rolesToAdd,
rank: "Beast"
}
}
if (rank === "Elite") {
const roles = roleManage("elite")
return {
rolesToRemove: roles.rolesToRemove,
rolesToAdd: roles.rolesToAdd,
rank: "Elite"
}
}
if (rank === "Member") {
const roles = roleManage("member")
return {
rolesToRemove: roles.rolesToRemove,
rolesToAdd: roles.rolesToAdd,
rank: "Member"
}
}
}

View File

@@ -1,8 +1,8 @@
import { beast, defaultMember, elite, gm, guildRole, guildStaff, manager, member, moderator, verifyTick } from "~/config/roles.js" import { beast, defaultMember, elite, gm, guildRole, guildStaff, leader, member, staff, verifyTick } from "~/config/roles.js"
const roles = [ const roles = [
gm, gm,
manager, leader,
moderator, staff,
beast, beast,
elite, elite,
member, member,
@@ -12,8 +12,8 @@ const roles = [
type RoleType = type RoleType =
| "gm" | "gm"
| "manager" | "leader"
| "moderator" | "staff"
| "beast" | "beast"
| "elite" | "elite"
| "member" | "member"
@@ -28,15 +28,15 @@ export default function roleManage(role: RoleType): { rolesToRemove: string[], r
return { rolesToRemove, rolesToAdd } return { rolesToRemove, rolesToAdd }
} }
if (role === "manager") { if (role === "leader") {
const rolesToRemove = roles.filter(role => role !== manager && role !== guildStaff && role !== guildRole) const rolesToRemove = roles.filter(role => role !== leader && role !== guildStaff && role !== guildRole)
const rolesToAdd = [manager, guildStaff, guildRole, verifyTick] const rolesToAdd = [leader, guildStaff, guildRole, verifyTick]
return { rolesToRemove, rolesToAdd } return { rolesToRemove, rolesToAdd }
} }
if (role === "moderator") { if (role === "staff") {
const rolesToRemove = roles.filter(role => role !== moderator && role !== guildStaff && role !== guildRole) const rolesToRemove = roles.filter(role => role !== staff && role !== guildStaff && role !== guildRole)
const rolesToAdd = [moderator, guildStaff, guildRole, verifyTick] const rolesToAdd = [staff, guildStaff, guildRole, verifyTick]
return { rolesToRemove, rolesToAdd } return { rolesToRemove, rolesToAdd }
} }

View File

@@ -33,7 +33,7 @@ export function log(m: string, t: LogType, c?: CustomColorProps): void {
const logType = AllLogs[t].m const logType = AllLogs[t].m
const logColor = AllLogs[t].c const logColor = AllLogs[t].c
const message = `[${logType}] ${time} | ${m}` const message = `${time} - [${logType}] | ${m}`
if (!c) { if (!c) {
if (t === "info") { if (t === "info") {
console.log(message) console.log(message)