({
guild,
member,
moderator,
reason = 'No reason provided'
})
| 208 | } |
| 209 | |
| 210 | static async kickUser({ |
| 211 | guild, |
| 212 | member, |
| 213 | moderator, |
| 214 | reason = 'No reason provided' |
| 215 | }) { |
| 216 | try { |
| 217 | if (!guild || !member || !moderator) { |
| 218 | throw new TitanBotError( |
| 219 | 'Missing required parameters', |
| 220 | ErrorTypes.VALIDATION, |
| 221 | 'Guild, member, and moderator are required' |
| 222 | ); |
| 223 | } |
| 224 | |
| 225 | this.assertModerationHierarchy(moderator, member, 'kick'); |
| 226 | |
| 227 | if (!member.kickable) { |
| 228 | const targetLabel = getTargetLabel(member); |
| 229 | throw new TitanBotError( |
| 230 | 'Cannot kick member', |
| 231 | ErrorTypes.PERMISSION, |
| 232 | `I cannot kick **${targetLabel}**. They may have **Administrator** permission or a managed/integration role. ` + |
| 233 | 'Ensure my bot role is above theirs in **Server Settings → Roles** and that they do not have Admin.' |
| 234 | ); |
| 235 | } |
| 236 | |
| 237 | await member.kick(reason); |
| 238 | |
| 239 | const caseId = await logModerationAction({ |
| 240 | client: guild.client, |
| 241 | guild, |
| 242 | event: { |
| 243 | action: 'Member Kicked', |
| 244 | target: `${member.user.tag} (${member.id})`, |
| 245 | executor: `${moderator.user.tag} (${moderator.id})`, |
| 246 | reason, |
| 247 | metadata: { |
| 248 | userId: member.id, |
| 249 | moderatorId: moderator.id |
| 250 | } |
| 251 | } |
| 252 | }); |
| 253 | |
| 254 | logger.info(`User kicked: ${member.user.tag} by ${moderator.user.tag} in ${guild.name}`); |
| 255 | |
| 256 | return { |
| 257 | success: true, |
| 258 | caseId, |
| 259 | user: member.user.tag, |
| 260 | reason |
| 261 | }; |
| 262 | } catch (error) { |
| 263 | logger.error('Error kicking user:', error); |
| 264 | throw error; |
| 265 | } |
| 266 | } |
| 267 |
no test coverage detected