feat: Add neru_message_cog with roleplay commands and message logic
This commit is contained in:
parent
1048a631a4
commit
b4079acf49
@ -1,17 +1,14 @@
|
|||||||
import discord
|
import discord
|
||||||
from discord import ui
|
from discord import ui
|
||||||
import random
|
|
||||||
import os
|
|
||||||
import asyncio
|
|
||||||
from typing import List, Dict, Optional, Set
|
from typing import List, Dict, Optional, Set
|
||||||
|
|
||||||
class WordleGame:
|
class WordleGame:
|
||||||
"""Class to handle Wordle game logic"""
|
"""Class to handle Wordle game logic"""
|
||||||
|
|
||||||
def __init__(self, word: str, max_attempts: int = 6):
|
def __init__(self, word: str, max_attempts: int = 6):
|
||||||
"""
|
"""
|
||||||
Initialize a new Wordle game
|
Initialize a new Wordle game
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
word: The target word to guess
|
word: The target word to guess
|
||||||
max_attempts: Maximum number of attempts allowed (default: 6)
|
max_attempts: Maximum number of attempts allowed (default: 6)
|
||||||
@ -22,40 +19,56 @@ class WordleGame:
|
|||||||
self.guesses = []
|
self.guesses = []
|
||||||
self.game_over = False
|
self.game_over = False
|
||||||
self.won = False
|
self.won = False
|
||||||
|
|
||||||
def make_guess(self, guess: str) -> List[Dict[str, str]]:
|
def make_guess(self, guess: str) -> List[Dict[str, str]]:
|
||||||
"""
|
"""
|
||||||
Process a guess and return the result
|
Process a guess and return the result
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
guess: The word guessed by the player
|
guess: The word guessed by the player
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
List of dictionaries with letter and status (correct, present, absent)
|
List of dictionaries with letter and status (correct, present, absent)
|
||||||
"""
|
"""
|
||||||
if self.game_over:
|
if self.game_over:
|
||||||
return []
|
return []
|
||||||
|
|
||||||
guess = guess.lower()
|
guess = guess.lower()
|
||||||
if len(guess) != len(self.word):
|
if len(guess) != len(self.word):
|
||||||
return []
|
return []
|
||||||
|
|
||||||
self.attempts += 1
|
self.attempts += 1
|
||||||
self.guesses.append(guess)
|
self.guesses.append(guess)
|
||||||
|
|
||||||
# Check if the guess is correct
|
# Check if the guess is correct
|
||||||
if guess == self.word:
|
if guess == self.word:
|
||||||
self.game_over = True
|
self.game_over = True
|
||||||
self.won = True
|
self.won = True
|
||||||
|
|
||||||
# Check if max attempts reached
|
# Check if max attempts reached
|
||||||
if self.attempts >= self.max_attempts:
|
if self.attempts >= self.max_attempts:
|
||||||
self.game_over = True
|
self.game_over = True
|
||||||
|
|
||||||
# Process the guess
|
# Process the guess
|
||||||
|
return self.evaluate_guess(guess)
|
||||||
|
|
||||||
|
def evaluate_guess(self, guess: str) -> List[Dict[str, str]]:
|
||||||
|
"""
|
||||||
|
Evaluate a guess without modifying game state
|
||||||
|
|
||||||
|
Args:
|
||||||
|
guess: The word to evaluate
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
List of dictionaries with letter and status (correct, present, absent)
|
||||||
|
"""
|
||||||
|
guess = guess.lower()
|
||||||
|
if len(guess) != len(self.word):
|
||||||
|
return []
|
||||||
|
|
||||||
result = []
|
result = []
|
||||||
word_chars = list(self.word)
|
word_chars = list(self.word)
|
||||||
|
|
||||||
# First pass: Find exact matches
|
# First pass: Find exact matches
|
||||||
for i, char in enumerate(guess):
|
for i, char in enumerate(guess):
|
||||||
if i < len(self.word) and char == self.word[i]:
|
if i < len(self.word) and char == self.word[i]:
|
||||||
@ -63,7 +76,7 @@ class WordleGame:
|
|||||||
word_chars[i] = None # Mark as used
|
word_chars[i] = None # Mark as used
|
||||||
else:
|
else:
|
||||||
result.append({"letter": char, "status": "unknown"})
|
result.append({"letter": char, "status": "unknown"})
|
||||||
|
|
||||||
# Second pass: Find misplaced letters
|
# Second pass: Find misplaced letters
|
||||||
for i, item in enumerate(result):
|
for i, item in enumerate(result):
|
||||||
if item["status"] == "unknown":
|
if item["status"] == "unknown":
|
||||||
@ -75,16 +88,16 @@ class WordleGame:
|
|||||||
else:
|
else:
|
||||||
# Letter doesn't exist in the word
|
# Letter doesn't exist in the word
|
||||||
result[i]["status"] = "absent"
|
result[i]["status"] = "absent"
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
class WordleView(ui.View):
|
class WordleView(ui.View):
|
||||||
"""Discord UI View for the Wordle game"""
|
"""Discord UI View for the Wordle game"""
|
||||||
|
|
||||||
def __init__(self, player: discord.Member, word: str, timeout: float = 600.0):
|
def __init__(self, player: discord.Member, word: str, timeout: float = 600.0):
|
||||||
"""
|
"""
|
||||||
Initialize the Wordle game view
|
Initialize the Wordle game view
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
player: The Discord member playing the game
|
player: The Discord member playing the game
|
||||||
word: The target word to guess
|
word: The target word to guess
|
||||||
@ -95,34 +108,33 @@ class WordleView(ui.View):
|
|||||||
self.game = WordleGame(word)
|
self.game = WordleGame(word)
|
||||||
self.message: Optional[discord.Message] = None
|
self.message: Optional[discord.Message] = None
|
||||||
self.used_letters: Set[str] = set()
|
self.used_letters: Set[str] = set()
|
||||||
|
|
||||||
async def interaction_check(self, interaction: discord.Interaction) -> bool:
|
async def interaction_check(self, interaction: discord.Interaction) -> bool:
|
||||||
"""Ensure only the player can interact with the game"""
|
"""Ensure only the player can interact with the game"""
|
||||||
if interaction.user.id != self.player.id:
|
if interaction.user.id != self.player.id:
|
||||||
await interaction.response.send_message("This is not your game!", ephemeral=True)
|
await interaction.response.send_message("This is not your game!", ephemeral=True)
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
async def on_timeout(self) -> None:
|
async def on_timeout(self) -> None:
|
||||||
"""Handle timeout - disable buttons and show the answer"""
|
"""Handle timeout - disable buttons and show the answer"""
|
||||||
if self.message:
|
if self.message:
|
||||||
self.game.game_over = True
|
self.game.game_over = True
|
||||||
await self.update_message(None, timeout=True)
|
await self.update_message(None, timeout=True)
|
||||||
|
|
||||||
def format_board(self) -> str:
|
def format_board(self) -> str:
|
||||||
"""Format the game board into a string representation"""
|
"""Format the game board into a string representation"""
|
||||||
if not self.game.guesses:
|
if not self.game.guesses:
|
||||||
# No guesses yet
|
# No guesses yet
|
||||||
return "No guesses yet. Use the button below to make a guess!"
|
return "No guesses yet. Use the button below to make a guess!"
|
||||||
|
|
||||||
board_lines = []
|
board_lines = []
|
||||||
|
|
||||||
# Add each guess with colored squares
|
# Add each guess with colored squares
|
||||||
for guess in self.game.guesses:
|
for guess in self.game.guesses:
|
||||||
result = self.game.make_guess(guess)
|
# Use evaluate_guess instead of make_guess to avoid modifying game state
|
||||||
# Skip re-processing the guess, just get the result
|
result = self.game.evaluate_guess(guess)
|
||||||
self.game.attempts -= 1
|
|
||||||
|
|
||||||
guess_line = ""
|
guess_line = ""
|
||||||
for item in result:
|
for item in result:
|
||||||
if item["status"] == "correct":
|
if item["status"] == "correct":
|
||||||
@ -131,44 +143,55 @@ class WordleView(ui.View):
|
|||||||
guess_line += f"🟨" # Yellow square for correct letter, wrong position
|
guess_line += f"🟨" # Yellow square for correct letter, wrong position
|
||||||
else:
|
else:
|
||||||
guess_line += f"⬛" # Black square for incorrect letter
|
guess_line += f"⬛" # Black square for incorrect letter
|
||||||
|
|
||||||
# Track used letters
|
# Track used letters
|
||||||
self.used_letters.add(item["letter"])
|
self.used_letters.add(item["letter"])
|
||||||
|
|
||||||
# Add the actual letters after the squares
|
# Add the actual letters after the squares
|
||||||
guess_line += f" {guess.upper()}"
|
guess_line += f" {guess.upper()}"
|
||||||
board_lines.append(guess_line)
|
board_lines.append(guess_line)
|
||||||
|
|
||||||
return "\n".join(board_lines)
|
return "\n".join(board_lines)
|
||||||
|
|
||||||
def format_keyboard(self) -> str:
|
def format_keyboard(self) -> str:
|
||||||
"""Format a keyboard showing used letters"""
|
"""Format a keyboard showing used letters"""
|
||||||
if not self.used_letters:
|
if not self.used_letters:
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
keyboard = [
|
keyboard = [
|
||||||
"QWERTYUIOP",
|
"QWERTYUIOP",
|
||||||
"ASDFGHJKL",
|
"ASDFGHJKL",
|
||||||
"ZXCVBNM"
|
"ZXCVBNM"
|
||||||
]
|
]
|
||||||
|
|
||||||
keyboard_lines = []
|
keyboard_lines = []
|
||||||
for row in keyboard:
|
for row in keyboard:
|
||||||
line = ""
|
line = ""
|
||||||
for letter in row:
|
for letter in row:
|
||||||
letter_lower = letter.lower()
|
letter_lower = letter.lower()
|
||||||
if letter_lower in self.used_letters:
|
if letter_lower in self.used_letters:
|
||||||
# Check the status of this letter in the most recent guess
|
# Determine the best status for this letter across all guesses
|
||||||
status = "absent" # Default to absent
|
status = "absent" # Default to absent
|
||||||
|
|
||||||
|
# Check if this letter appears as correct in any position
|
||||||
|
correct_position = False
|
||||||
|
present_position = False
|
||||||
|
|
||||||
for guess in self.game.guesses:
|
for guess in self.game.guesses:
|
||||||
|
result = self.game.evaluate_guess(guess)
|
||||||
for i, char in enumerate(guess):
|
for i, char in enumerate(guess):
|
||||||
if char == letter_lower:
|
if char == letter_lower:
|
||||||
if char == self.game.word[i]:
|
if result[i]["status"] == "correct":
|
||||||
status = "correct"
|
correct_position = True
|
||||||
break
|
break
|
||||||
elif char in self.game.word:
|
elif result[i]["status"] == "present":
|
||||||
status = "present"
|
present_position = True
|
||||||
|
|
||||||
|
if correct_position:
|
||||||
|
status = "correct"
|
||||||
|
elif present_position:
|
||||||
|
status = "present"
|
||||||
|
|
||||||
if status == "correct":
|
if status == "correct":
|
||||||
line += f"🟩" # Green for correct
|
line += f"🟩" # Green for correct
|
||||||
elif status == "present":
|
elif status == "present":
|
||||||
@ -178,28 +201,28 @@ class WordleView(ui.View):
|
|||||||
else:
|
else:
|
||||||
line += f"⬜" # White for unused
|
line += f"⬜" # White for unused
|
||||||
keyboard_lines.append(line)
|
keyboard_lines.append(line)
|
||||||
|
|
||||||
return "\n".join(keyboard_lines)
|
return "\n".join(keyboard_lines)
|
||||||
|
|
||||||
async def update_message(self, interaction: Optional[discord.Interaction] = None, timeout: bool = False) -> None:
|
async def update_message(self, interaction: Optional[discord.Interaction] = None, timeout: bool = False) -> None:
|
||||||
"""Update the game message with the current state"""
|
"""Update the game message with the current state"""
|
||||||
if not self.message:
|
if not self.message:
|
||||||
return
|
return
|
||||||
|
|
||||||
# Format the message content
|
# Format the message content
|
||||||
content = f"# Wordle Game\n\n"
|
content = f"# Wordle Game\n\n"
|
||||||
content += self.format_board()
|
content += self.format_board()
|
||||||
content += f"\n\n"
|
content += f"\n\n"
|
||||||
|
|
||||||
# Add keyboard
|
# Add keyboard
|
||||||
keyboard = self.format_keyboard()
|
keyboard = self.format_keyboard()
|
||||||
if keyboard:
|
if keyboard:
|
||||||
content += f"{keyboard}\n\n"
|
content += f"{keyboard}\n\n"
|
||||||
|
|
||||||
# Add game status
|
# Add game status
|
||||||
attempts_left = self.game.max_attempts - self.game.attempts
|
attempts_left = self.game.max_attempts - self.game.attempts
|
||||||
content += f"Attempts: {self.game.attempts}/{self.game.max_attempts} ({attempts_left} left)\n"
|
content += f"Attempts: {self.game.attempts}/{self.game.max_attempts} ({attempts_left} left)\n"
|
||||||
|
|
||||||
# Add game result if game is over
|
# Add game result if game is over
|
||||||
if self.game.game_over:
|
if self.game.game_over:
|
||||||
self.clear_items() # Remove all buttons
|
self.clear_items() # Remove all buttons
|
||||||
@ -209,15 +232,15 @@ class WordleView(ui.View):
|
|||||||
content += f"\n⏰ Time's up! The word was **{self.game.word.upper()}**."
|
content += f"\n⏰ Time's up! The word was **{self.game.word.upper()}**."
|
||||||
else:
|
else:
|
||||||
content += f"\n❌ Game over! The word was **{self.game.word.upper()}**."
|
content += f"\n❌ Game over! The word was **{self.game.word.upper()}**."
|
||||||
|
|
||||||
# Update the message
|
# Update the message
|
||||||
if interaction:
|
if interaction:
|
||||||
await interaction.response.edit_message(content=content, view=self)
|
await interaction.response.edit_message(content=content, view=self)
|
||||||
else:
|
else:
|
||||||
await self.message.edit(content=content, view=self)
|
await self.message.edit(content=content, view=self)
|
||||||
|
|
||||||
@ui.button(label="Make a Guess", style=discord.ButtonStyle.primary)
|
@ui.button(label="Make a Guess", style=discord.ButtonStyle.primary)
|
||||||
async def guess_button(self, interaction: discord.Interaction, button: ui.Button):
|
async def guess_button(self, interaction: discord.Interaction, _: ui.Button):
|
||||||
"""Button to make a guess"""
|
"""Button to make a guess"""
|
||||||
# Create and send the modal
|
# Create and send the modal
|
||||||
modal = WordleGuessModal(self)
|
modal = WordleGuessModal(self)
|
||||||
@ -225,7 +248,7 @@ class WordleView(ui.View):
|
|||||||
|
|
||||||
class WordleGuessModal(ui.Modal, title="Enter your guess"):
|
class WordleGuessModal(ui.Modal, title="Enter your guess"):
|
||||||
"""Modal for entering a Wordle guess"""
|
"""Modal for entering a Wordle guess"""
|
||||||
|
|
||||||
guess = ui.TextInput(
|
guess = ui.TextInput(
|
||||||
label="Your 5-letter guess",
|
label="Your 5-letter guess",
|
||||||
placeholder="Enter a 5-letter word",
|
placeholder="Enter a 5-letter word",
|
||||||
@ -233,38 +256,39 @@ class WordleGuessModal(ui.Modal, title="Enter your guess"):
|
|||||||
max_length=5,
|
max_length=5,
|
||||||
required=True
|
required=True
|
||||||
)
|
)
|
||||||
|
|
||||||
def __init__(self, view: WordleView):
|
def __init__(self, view: WordleView):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.wordle_view = view
|
self.wordle_view = view
|
||||||
|
|
||||||
async def on_submit(self, interaction: discord.Interaction):
|
async def on_submit(self, interaction: discord.Interaction):
|
||||||
"""Process the submitted guess"""
|
"""Process the submitted guess"""
|
||||||
guess = self.guess.value.strip().lower()
|
guess = self.guess.value.strip().lower()
|
||||||
|
|
||||||
# Validate the guess
|
# Validate the guess
|
||||||
if len(guess) != 5:
|
if len(guess) != 5:
|
||||||
await interaction.response.send_message("Please enter a 5-letter word.", ephemeral=True)
|
await interaction.response.send_message("Please enter a 5-letter word.", ephemeral=True)
|
||||||
return
|
return
|
||||||
|
|
||||||
if not guess.isalpha():
|
if not guess.isalpha():
|
||||||
await interaction.response.send_message("Your guess must contain only letters.", ephemeral=True)
|
await interaction.response.send_message("Your guess must contain only letters.", ephemeral=True)
|
||||||
return
|
return
|
||||||
|
|
||||||
# Process the guess
|
# Process the guess - this is the only place where make_guess should be called
|
||||||
|
# to actually modify the game state
|
||||||
self.wordle_view.game.make_guess(guess)
|
self.wordle_view.game.make_guess(guess)
|
||||||
|
|
||||||
# Update the game message
|
# Update the game message
|
||||||
await self.wordle_view.update_message(interaction)
|
await self.wordle_view.update_message(interaction)
|
||||||
|
|
||||||
def load_word_list(file_path: str = "words.txt", word_length: int = 5) -> List[str]:
|
def load_word_list(file_path: str = "words.txt", word_length: int = 5) -> List[str]:
|
||||||
"""
|
"""
|
||||||
Load and filter words from a file
|
Load and filter words from a file
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
file_path: Path to the words file
|
file_path: Path to the words file
|
||||||
word_length: Length of words to filter (default: 5 for Wordle)
|
word_length: Length of words to filter (default: 5 for Wordle)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
List of words with the specified length
|
List of words with the specified length
|
||||||
"""
|
"""
|
||||||
|
130
cogs/neru_message_cog.py
Normal file
130
cogs/neru_message_cog.py
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
import discord
|
||||||
|
from discord.ext import commands
|
||||||
|
from discord import app_commands
|
||||||
|
import random
|
||||||
|
|
||||||
|
class MessageCog(commands.Cog):
|
||||||
|
def __init__(self, bot):
|
||||||
|
self.bot = bot
|
||||||
|
# Hardcoded message with {target} placeholder
|
||||||
|
self.message_template = """
|
||||||
|
{target} - Your pants are slowly and deliberately removed, leaving you feeling exposed and vulnerable. The sensation is both thrilling and terrifying as a presence looms over you, the only sound being the faint rustling of fabric as your clothes are discarded.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Helper method for the message logic
|
||||||
|
async def _message_logic(self, target):
|
||||||
|
"""Core logic for the message command."""
|
||||||
|
# Replace {target} with the mentioned user
|
||||||
|
return self.message_template.format(target=target)
|
||||||
|
|
||||||
|
# --- RP Group ---
|
||||||
|
rp = app_commands.Group(name="rp", description="Roleplay commands")
|
||||||
|
|
||||||
|
@rp.command(name="sex", description="Send a normal sex message to the mentioned user")
|
||||||
|
@app_commands.allowed_installs(guilds=True, users=True)
|
||||||
|
@app_commands.allowed_contexts(guilds=True, dms=True, private_channels=True)
|
||||||
|
@app_commands.describe(member="The user to send the message to")
|
||||||
|
async def sex_slash(self, interaction: discord.Interaction, member: discord.User):
|
||||||
|
"""Slash command version of sex."""
|
||||||
|
sex_messages = [
|
||||||
|
f"{interaction.user.mention} and {member.mention} shared a tender kiss that deepened into a passionate embrace.",
|
||||||
|
f"{interaction.user.mention} gently caressed {member.mention}'s cheek before their lips met, igniting a spark.",
|
||||||
|
f"With a soft touch, {interaction.user.mention} guided {member.mention}'s hand to their waist, pulling them closer.",
|
||||||
|
f"{interaction.user.mention} whispered sweet nothings into {member.mention}'s ear, sending shivers down their spine.",
|
||||||
|
f"Their bodies pressed together, {interaction.user.mention} and {member.mention} moved in a slow, sensual rhythm.",
|
||||||
|
f"{member.mention} moaned softly as {interaction.user.mention}'s touch became more intimate.",
|
||||||
|
f"{interaction.user.mention}'s fingers traced the curve of {member.mention}'s back, eliciting a gasp.",
|
||||||
|
f"In the dim light, {interaction.user.mention} admired the beauty of {member.mention}'s form.",
|
||||||
|
f"Their breaths mingled as {interaction.user.mention} and {member.mention} lost themselves in the moment.",
|
||||||
|
f"{member.mention}'s legs wrapped around {interaction.user.mention}'s waist, pulling them into a deeper connection.",
|
||||||
|
f"{interaction.user.mention} buried their face in {member.mention}'s neck, inhaling their scent.",
|
||||||
|
f"The room filled with soft sounds of pleasure as {interaction.user.mention} and {member.mention} explored each other.",
|
||||||
|
f"{member.mention}'s fingers tangled in {interaction.user.mention}'s hair, holding them close.",
|
||||||
|
f"{interaction.user.mention}'s hips moved against {member.mention}'s, building a delicious tension.",
|
||||||
|
f"With a final, shared sigh, {interaction.user.mention} and {member.mention} found release in each other's arms.",
|
||||||
|
f"{interaction.user.mention} and {member.mention} lay tangled in the sheets, their bodies still humming with the afterglow.",
|
||||||
|
f"{member.mention} rested their head on {interaction.user.mention}'s chest, listening to their heartbeat.",
|
||||||
|
f"{interaction.user.mention} kissed {member.mention}'s forehead, a silent promise of more to come.",
|
||||||
|
f"The scent of their lovemaking hung in the air as {interaction.user.mention} and {member.mention} drifted off to sleep.",
|
||||||
|
f"{interaction.user.mention} and {member.mention} woke up intertwined, the morning sun casting a warm glow on their bodies.",
|
||||||
|
f"{interaction.user.mention} and {member.mention} had a passionate night together.",
|
||||||
|
f"{interaction.user.mention} made love to {member.mention}.",
|
||||||
|
f"{member.mention} was pleasured by {interaction.user.mention}.",
|
||||||
|
f"{interaction.user.mention} and {member.mention} shared an intimate moment.",
|
||||||
|
f"{interaction.user.mention} and {member.mention} explored their desires.",
|
||||||
|
f"{member.mention} felt a deep connection with {interaction.user.mention} during their encounter.",
|
||||||
|
f"{interaction.user.mention} and {member.mention} experienced mutual pleasure."
|
||||||
|
]
|
||||||
|
response = random.choice(sex_messages)
|
||||||
|
await interaction.response.send_message(response)
|
||||||
|
|
||||||
|
@commands.command(name="sex")
|
||||||
|
async def sex_legacy(self, ctx: commands.Context, member: discord.User):
|
||||||
|
"""Legacy command version of sex."""
|
||||||
|
sex_messages = [
|
||||||
|
f"{ctx.author.mention} and {member.mention} shared a tender kiss that deepened into a passionate embrace.",
|
||||||
|
f"{ctx.author.mention} gently caressed {member.mention}'s cheek before their lips met, igniting a spark.",
|
||||||
|
f"With a soft touch, {ctx.author.mention} guided {member.mention}'s hand to their waist, pulling them closer.",
|
||||||
|
f"{ctx.author.mention} whispered sweet nothings into {member.mention}'s ear, sending shivers down their spine.",
|
||||||
|
f"Their bodies pressed together, {ctx.author.mention} and {member.mention} moved in a slow, sensual rhythm.",
|
||||||
|
f"{member.mention} moaned softly as {ctx.author.mention}'s touch became more intimate.",
|
||||||
|
f"{ctx.author.mention}'s fingers traced the curve of {member.mention}'s back, eliciting a gasp.",
|
||||||
|
f"In the dim light, {ctx.author.mention} admired the beauty of {member.mention}'s form.",
|
||||||
|
f"Their breaths mingled as {ctx.author.mention} and {member.mention} lost themselves in the moment.",
|
||||||
|
f"{member.mention}'s legs wrapped around {ctx.author.mention}'s waist, pulling them into a deeper connection.",
|
||||||
|
f"{ctx.author.mention} buried their face in {member.mention}'s neck, inhaling their scent.",
|
||||||
|
f"The room filled with soft sounds of pleasure as {ctx.author.mention} and {member.mention} explored each other.",
|
||||||
|
f"{member.mention}'s fingers tangled in {ctx.author.mention}'s hair, holding them close.",
|
||||||
|
f"{ctx.author.mention}'s hips moved against {member.mention}'s, building a delicious tension.",
|
||||||
|
f"With a final, shared sigh, {ctx.author.mention} and {member.mention} found release in each other's arms.",
|
||||||
|
f"{ctx.author.mention} and {member.mention} lay tangled in the sheets, their bodies still humming with the afterglow.",
|
||||||
|
f"{member.mention} rested their head on {ctx.author.mention}'s chest, listening to their heartbeat.",
|
||||||
|
f"{ctx.author.mention} kissed {member.mention}'s forehead, a silent promise of more to come.",
|
||||||
|
f"The scent of their lovemaking hung in the air as {ctx.author.mention} and {member.mention} drifted off to sleep.",
|
||||||
|
f"{ctx.author.mention} and {member.mention} woke up intertwined, the morning sun casting a warm glow on their bodies.",
|
||||||
|
f"{ctx.author.mention} and {member.mention} had a passionate night together.",
|
||||||
|
f"{ctx.author.mention} made love to {member.mention}.",
|
||||||
|
f"{member.mention} was pleasured by {ctx.author.mention}.",
|
||||||
|
f"{ctx.author.mention} and {member.mention} shared an intimate moment.",
|
||||||
|
f"{ctx.author.mention} and {member.mention} explored their desires.",
|
||||||
|
f"{member.mention} felt a deep connection with {ctx.author.mention} during their encounter.",
|
||||||
|
f"{ctx.author.mention} and {member.mention} experienced mutual pleasure."
|
||||||
|
]
|
||||||
|
response = random.choice(sex_messages)
|
||||||
|
await ctx.reply(response)
|
||||||
|
|
||||||
|
# --- Memes Group ---
|
||||||
|
memes = app_commands.Group(name="memes", description="Meme and copypasta commands")
|
||||||
|
|
||||||
|
@memes.command(name="seals", description="What the fuck did you just fucking say about me, you little bitch?")
|
||||||
|
@app_commands.allowed_installs(guilds=True, users=True)
|
||||||
|
@app_commands.allowed_contexts(guilds=True, dms=True, private_channels=True)
|
||||||
|
async def seals_slash(self, interaction: discord.Interaction):
|
||||||
|
await interaction.response.send_message("What the fuck did you just fucking say about me, you little bitch? I'll have you know I graduated top of my class in the Navy Seals, and I've been involved in numerous secret raids on Al-Quaeda, and I have over 300 confirmed kills. I am trained in gorilla warfare and I'm the top sniper in the entire US armed forces. You are nothing to me but just another target. I will wipe you the fuck out with precision the likes of which has never been seen before on this Earth, mark my fucking words. You think you can get away with saying that shit to me over the Internet? Think again, fucker. As we speak I am contacting my secret network of spies across the USA and your IP is being traced right now so you better prepare for the storm, maggot. The storm that wipes out the pathetic little thing you call your life. You're fucking dead, kid. I can be anywhere, anytime, and I can kill you in over seven hundred ways, and that's just with my bare hands. Not only am I extensively trained in unarmed combat, but I have access to the entire arsenal of the United States Marine Corps and I will use it to its full extent to wipe your miserable ass off the face of the continent, you little shit. If only you could have known what unholy retribution your little \"clever\" comment was about to bring down upon you, maybe you would have held your fucking tongue. But you couldn't, you didn't, and now you're paying the price, you goddamn idiot. I will shit fury all over you and you will drown in it. You're fucking dead, kiddo.")
|
||||||
|
|
||||||
|
@commands.command(name="seals", help="What the fuck did you just fucking say about me, you little bitch?") # Assuming you want to keep this check for the legacy command
|
||||||
|
async def seals_legacy(self, ctx):
|
||||||
|
await ctx.send("What the fuck did you just fucking say about me, you little bitch? I'll have you know I graduated top of my class in the Navy Seals, and I've been involved in numerous secret raids on Al-Quaeda, and I have over 300 confirmed kills. I am trained in gorilla warfare and I'm the top sniper in the entire US armed forces. You are nothing to me but just another target. I will wipe you the fuck out with precision the likes of which has never been seen before on this Earth, mark my fucking words. You think you can get away with saying that shit to me over the Internet? Think again, fucker. As we speak I am contacting my secret network of spies across the USA and your IP is being traced right now so you better prepare for the storm, maggot. The storm that wipes out the pathetic little thing you call your life. You're fucking dead, kid. I can be anywhere, anytime, and I can kill you in over seven hundred ways, and that's just with my bare hands. Not only am I extensively trained in unarmed combat, but I have access to the entire arsenal of the United States Marine Corps and I will use it to its full extent to wipe your miserable ass off the face of the continent, you little shit. If only you could have known what unholy retribution your little \"clever\" comment was about to bring down upon you, maybe you would have held your fucking tongue. But you couldn't, you didn't, and now you're paying the price, you goddamn idiot. I will shit fury all over you and you will drown in it. You're fucking dead, kiddo.")
|
||||||
|
|
||||||
|
@memes.command(name="notlikeus", description="Honestly i think They Not Like Us is the only mumble rap song that is good")
|
||||||
|
@app_commands.allowed_installs(guilds=True, users=True)
|
||||||
|
@app_commands.allowed_contexts(guilds=True, dms=True, private_channels=True)
|
||||||
|
async def notlikeus_slash(self, interaction: discord.Interaction):
|
||||||
|
await interaction.response.send_message("Honestly i think They Not Like Us is the only mumble rap song that is good, because it calls out Drake for being a Diddy blud")
|
||||||
|
|
||||||
|
@commands.command(name="notlikeus", help="Honestly i think They Not Like Us is the only mumble rap song that is good") # Assuming you want to keep this check for the legacy command
|
||||||
|
async def notlikeus_legacy(self, ctx):
|
||||||
|
await ctx.send("Honestly i think They Not Like Us is the only mumble rap song that is good, because it calls out Drake for being a Diddy blud")
|
||||||
|
|
||||||
|
@memes.command(name="pmo", description="icl u pmo")
|
||||||
|
@app_commands.allowed_installs(guilds=True, users=True)
|
||||||
|
@app_commands.allowed_contexts(guilds=True, dms=True, private_channels=True)
|
||||||
|
async def pmo_slash(self, interaction: discord.Interaction):
|
||||||
|
await interaction.response.send_message("icl u pmo n ts pmo sm ngl r u fr rn b fr I h8 bein diff idek anm mn js I h8 ts y r u so b so fr w me rn cz lol oms icl ts pmo sm n sb rn ngl, r u srsly srs n fr rn vro? lol atp js qt")
|
||||||
|
|
||||||
|
@commands.command(name="pmo", help="icl u pmo n ts pmo sm ngl r u fr rn b fr I h8 bein diff idek anm mn js I h8 ts y r u so b so fr w me rn cz lol oms icl ts pmo sm n sb rn ngl, r u srsly srs n fr rn vro? lol atp js qt")
|
||||||
|
async def pmo_legacy(self, ctx: commands.Context):
|
||||||
|
await ctx.send("icl u pmo n ts pmo sm ngl r u fr rn b fr I h8 bein diff idek anm mn js I h8 ts y r u so b so fr w me rn cz lol oms icl ts pmo sm n sb rn ngl, r u srsly srs n fr rn vro? lol atp js qt")
|
||||||
|
|
||||||
|
async def setup(bot: commands.Bot):
|
||||||
|
await bot.add_cog(MessageCog(bot))
|
@ -21,6 +21,7 @@ async def load_all_cogs(bot: commands.Bot, skip_cogs: Optional[List[str]] = None
|
|||||||
not filename.startswith("__") and \
|
not filename.startswith("__") and \
|
||||||
not filename.startswith("gurt") and \
|
not filename.startswith("gurt") and \
|
||||||
not filename.startswith("profile_updater") and \
|
not filename.startswith("profile_updater") and \
|
||||||
|
not filename.startswith("neru") and \
|
||||||
not filename.endswith("_base_cog.py") and \
|
not filename.endswith("_base_cog.py") and \
|
||||||
not filename.startswith("femdom"):
|
not filename.startswith("femdom"):
|
||||||
# Special check for welcome_cog.py
|
# Special check for welcome_cog.py
|
||||||
|
@ -89,7 +89,7 @@ class NeruBot(commands.Bot):
|
|||||||
hardcoded_cogs = [
|
hardcoded_cogs = [
|
||||||
"cogs.settings_cog",
|
"cogs.settings_cog",
|
||||||
"cogs.help_cog",
|
"cogs.help_cog",
|
||||||
"cogs.message_cog",
|
"cogs.neru_message_cog",
|
||||||
"cogs.owoify_cog",
|
"cogs.owoify_cog",
|
||||||
"cogs.caption_cog",
|
"cogs.caption_cog",
|
||||||
"cogs.games_cog",
|
"cogs.games_cog",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user