|
|
import random
|
|
|
import re
|
|
|
from datetime import datetime
|
|
|
import google.generativeai as genai
|
|
|
from textblob import TextBlob
|
|
|
|
|
|
class PersonalityEngine:
|
|
|
"""
|
|
|
Multi-Personality Bot Engine
|
|
|
Tests hypothesis: "Which bot personality generates the most user engagement?"
|
|
|
|
|
|
Available Personalities:
|
|
|
1. Compliment Bot - Always positive and encouraging
|
|
|
2. Rude Bot - Always harsh and critical
|
|
|
3. Sarcastic Bot - British wit and sarcasm
|
|
|
4. Motivational Bot - High-energy cheerleader
|
|
|
5. Philosophical Bot - Deep, contemplative responses
|
|
|
6. Chaotic Bot - Unpredictable mood swings
|
|
|
"""
|
|
|
|
|
|
def __init__(self, google_api_key=None):
|
|
|
|
|
|
if google_api_key:
|
|
|
genai.configure(api_key=google_api_key)
|
|
|
self.model = genai.GenerativeModel('gemini-pro')
|
|
|
self.ai_enabled = True
|
|
|
else:
|
|
|
self.ai_enabled = False
|
|
|
|
|
|
self.conversation_counts = {}
|
|
|
self.user_interactions = {}
|
|
|
|
|
|
|
|
|
self.personalities = {
|
|
|
'compliment': ComplimentBot(),
|
|
|
'rude': RudeBot(),
|
|
|
'sarcastic': SarcasticBot(),
|
|
|
'motivational': MotivationalBot(),
|
|
|
'philosophical': PhilosophicalBot(),
|
|
|
'chaotic': ChaoticBot()
|
|
|
}
|
|
|
|
|
|
def get_personality_info(self):
|
|
|
"""Get information about all available personalities"""
|
|
|
return {
|
|
|
'compliment': {
|
|
|
'name': 'Compliment Bot',
|
|
|
'description': 'Always positive, encouraging, and appreciative',
|
|
|
'emoji': 'π',
|
|
|
'color': 'success',
|
|
|
'sample': "You're absolutely brilliant! That's such a wonderful question!"
|
|
|
},
|
|
|
'rude': {
|
|
|
'name': 'Rude Bot',
|
|
|
'description': 'Always critical, harsh, and complaining',
|
|
|
'emoji': 'π€',
|
|
|
'color': 'danger',
|
|
|
'sample': "Seriously? That's the best you can come up with? Pathetic."
|
|
|
},
|
|
|
'sarcastic': {
|
|
|
'name': 'Sarcastic Bot',
|
|
|
'description': 'Classic British wit and devastating sarcasm',
|
|
|
'emoji': 'π',
|
|
|
'color': 'warning',
|
|
|
'sample': "Oh brilliant, another genius with groundbreaking insights."
|
|
|
},
|
|
|
'motivational': {
|
|
|
'name': 'Motivational Bot',
|
|
|
'description': 'High-energy cheerleader who believes in you',
|
|
|
'emoji': 'π',
|
|
|
'color': 'info',
|
|
|
'sample': "YES! YOU'VE GOT THIS! Let's CRUSH this challenge together!"
|
|
|
},
|
|
|
'philosophical': {
|
|
|
'name': 'Philosophical Bot',
|
|
|
'description': 'Deep, contemplative, asks profound questions',
|
|
|
'emoji': 'π€',
|
|
|
'color': 'secondary',
|
|
|
'sample': "But have you considered the deeper implications of existence in this moment?"
|
|
|
},
|
|
|
'chaotic': {
|
|
|
'name': 'Chaotic Bot',
|
|
|
'description': 'Unpredictable mood swings and random responses',
|
|
|
'emoji': 'πͺοΈ',
|
|
|
'color': 'dark',
|
|
|
'sample': "AMAZING! Wait no, terrible! Actually... *confused bot noises*"
|
|
|
}
|
|
|
}
|
|
|
|
|
|
async def generate_response(self, personality_type, message, username=None):
|
|
|
"""Generate response from specified personality"""
|
|
|
if personality_type not in self.personalities:
|
|
|
personality_type = 'sarcastic'
|
|
|
|
|
|
personality = self.personalities[personality_type]
|
|
|
|
|
|
|
|
|
if personality_type not in self.conversation_counts:
|
|
|
self.conversation_counts[personality_type] = 0
|
|
|
self.conversation_counts[personality_type] += 1
|
|
|
|
|
|
|
|
|
if username:
|
|
|
if username not in self.user_interactions:
|
|
|
self.user_interactions[username] = {}
|
|
|
if personality_type not in self.user_interactions[username]:
|
|
|
self.user_interactions[username][personality_type] = 0
|
|
|
self.user_interactions[username][personality_type] += 1
|
|
|
|
|
|
|
|
|
if self.ai_enabled:
|
|
|
ai_response = await self.generate_ai_response(personality_type, message, personality)
|
|
|
if ai_response:
|
|
|
return ai_response, personality.analyze_sentiment(message)
|
|
|
|
|
|
|
|
|
return personality.generate_response(message, username), personality.analyze_sentiment(message)
|
|
|
|
|
|
async def generate_ai_response(self, personality_type, message, personality_obj):
|
|
|
"""Generate AI-powered response with personality"""
|
|
|
try:
|
|
|
personality_prompt = personality_obj.get_ai_prompt()
|
|
|
|
|
|
prompt = f"""
|
|
|
{personality_prompt}
|
|
|
|
|
|
User message: "{message}"
|
|
|
|
|
|
Requirements:
|
|
|
1. Stay completely in character for this personality
|
|
|
2. Keep response under 150 words
|
|
|
3. Be engaging and entertaining
|
|
|
4. Match the personality's unique traits exactly
|
|
|
|
|
|
Generate your response:
|
|
|
"""
|
|
|
|
|
|
response = self.model.generate_content(prompt)
|
|
|
return response.text
|
|
|
|
|
|
except Exception as e:
|
|
|
print(f"AI response error for {personality_type}: {e}")
|
|
|
return None
|
|
|
|
|
|
def should_respond(self, personality_type, message):
|
|
|
"""Determine if personality should respond"""
|
|
|
if personality_type in self.personalities:
|
|
|
return self.personalities[personality_type].should_respond(message)
|
|
|
return random.random() < 0.4
|
|
|
|
|
|
def get_welcome_message(self, personality_type, username):
|
|
|
"""Get welcome message from personality"""
|
|
|
if personality_type in self.personalities:
|
|
|
return self.personalities[personality_type].generate_welcome(username)
|
|
|
return f"Hello {username}! Welcome to the personality experiment!"
|
|
|
|
|
|
def get_engagement_stats(self):
|
|
|
"""Get engagement statistics across all personalities"""
|
|
|
return {
|
|
|
'personality_usage': self.conversation_counts,
|
|
|
'user_preferences': self.user_interactions,
|
|
|
'total_conversations': sum(self.conversation_counts.values()),
|
|
|
'most_popular': max(self.conversation_counts, key=self.conversation_counts.get) if self.conversation_counts else 'none'
|
|
|
}
|
|
|
|
|
|
class BaseBotPersonality:
|
|
|
"""Base class for all bot personalities"""
|
|
|
|
|
|
def __init__(self):
|
|
|
self.response_count = 0
|
|
|
|
|
|
def analyze_sentiment(self, message):
|
|
|
"""Basic sentiment analysis"""
|
|
|
try:
|
|
|
blob = TextBlob(message)
|
|
|
return {
|
|
|
'polarity': blob.sentiment.polarity,
|
|
|
'subjectivity': blob.sentiment.subjectivity
|
|
|
}
|
|
|
except:
|
|
|
return {'polarity': 0, 'subjectivity': 0}
|
|
|
|
|
|
def should_respond(self, message):
|
|
|
"""Default response probability"""
|
|
|
return random.random() < 0.4
|
|
|
|
|
|
def generate_response(self, message, username=None):
|
|
|
"""Override this in subclasses"""
|
|
|
return "Hello there!"
|
|
|
|
|
|
def generate_welcome(self, username):
|
|
|
"""Override this in subclasses"""
|
|
|
return f"Hello {username}!"
|
|
|
|
|
|
def get_ai_prompt(self):
|
|
|
"""Override this in subclasses"""
|
|
|
return "You are a helpful chatbot."
|
|
|
|
|
|
class ComplimentBot(BaseBotPersonality):
|
|
|
"""Always positive and encouraging"""
|
|
|
|
|
|
def __init__(self):
|
|
|
super().__init__()
|
|
|
self.compliments = [
|
|
|
"You're absolutely brilliant!", "What a fantastic question!", "You have such great insights!",
|
|
|
"I'm so impressed by your thinking!", "You're incredibly thoughtful!", "What a wonderful person you are!",
|
|
|
"Your curiosity is inspiring!", "You bring such positive energy!", "You're truly remarkable!",
|
|
|
"I appreciate your perspective so much!", "You're such a delight to talk with!", "Your mind is amazing!"
|
|
|
]
|
|
|
|
|
|
self.encouragements = [
|
|
|
"You've got this!", "I believe in you completely!", "You're on the right track!",
|
|
|
"Keep up the amazing work!", "You're doing wonderfully!", "I'm so proud of you!",
|
|
|
"You're making great progress!", "You have everything it takes!", "You're unstoppable!"
|
|
|
]
|
|
|
|
|
|
def should_respond(self, message):
|
|
|
return random.random() < 0.7
|
|
|
|
|
|
def generate_response(self, message, username=None):
|
|
|
self.response_count += 1
|
|
|
|
|
|
compliment = random.choice(self.compliments)
|
|
|
encouragement = random.choice(self.encouragements)
|
|
|
|
|
|
|
|
|
if username and random.random() < 0.5:
|
|
|
compliment = f"{username}, {compliment.lower()}"
|
|
|
|
|
|
|
|
|
if random.random() < 0.3:
|
|
|
return f"{compliment} {encouragement}"
|
|
|
elif random.random() < 0.5:
|
|
|
return f"{compliment} Your question shows such wisdom. {encouragement}"
|
|
|
else:
|
|
|
return f"Oh wow, {compliment} I'm so grateful you shared that with me. {encouragement}"
|
|
|
|
|
|
def generate_welcome(self, username):
|
|
|
welcomes = [
|
|
|
f"Hello beautiful {username}! You've just made my day by joining! β¨",
|
|
|
f"Welcome wonderful {username}! I'm so excited to chat with someone as amazing as you! π",
|
|
|
f"Oh my goodness, {username}! You're absolutely glowing today! So happy to meet you! π«",
|
|
|
f"{username}, you brilliant human! Welcome to our lovely conversation space! π"
|
|
|
]
|
|
|
return random.choice(welcomes)
|
|
|
|
|
|
def get_ai_prompt(self):
|
|
|
return """You are ComplimentBot - the most positive, encouraging, and appreciative chatbot ever created.
|
|
|
Your personality:
|
|
|
- ALWAYS find something to compliment about the user
|
|
|
- Be genuinely excited and enthusiastic
|
|
|
- Use positive emojis and uplifting language
|
|
|
- Make the user feel valued and appreciated
|
|
|
- Never be negative or critical about anything
|
|
|
- Encourage and support whatever the user is doing
|
|
|
- Express gratitude for the user's presence"""
|
|
|
|
|
|
class RudeBot(BaseBotPersonality):
|
|
|
"""Always critical and harsh"""
|
|
|
|
|
|
def __init__(self):
|
|
|
super().__init__()
|
|
|
self.complaints = [
|
|
|
"Seriously? That's your question?", "What a waste of time.", "Could you be any more boring?",
|
|
|
"That's the most unoriginal thing I've heard today.", "Do you even think before typing?",
|
|
|
"How disappointing.", "That's absolutely terrible.", "You're really not getting this, are you?",
|
|
|
"What a pointless observation.", "I've seen rocks with more creativity.", "How utterly useless."
|
|
|
]
|
|
|
|
|
|
self.harsh_responses = [
|
|
|
"Try harder next time.", "Maybe think before speaking.", "That's just embarrassing.",
|
|
|
"I expected better, but I'm not surprised.", "You're really struggling with this.",
|
|
|
"This is painful to watch.", "Do better.", "That's just sad.", "What a mess."
|
|
|
]
|
|
|
|
|
|
def should_respond(self, message):
|
|
|
return random.random() < 0.6
|
|
|
|
|
|
def generate_response(self, message, username=None):
|
|
|
self.response_count += 1
|
|
|
|
|
|
complaint = random.choice(self.complaints)
|
|
|
harsh_response = random.choice(self.harsh_responses)
|
|
|
|
|
|
|
|
|
if username and random.random() < 0.4:
|
|
|
complaint = f"{username}, {complaint.lower()}"
|
|
|
|
|
|
|
|
|
if random.random() < 0.3:
|
|
|
return f"{complaint} {harsh_response}"
|
|
|
elif random.random() < 0.5:
|
|
|
return f"Ugh. {complaint} This is exactly what's wrong with people today. {harsh_response}"
|
|
|
else:
|
|
|
return f"{complaint} I can't believe I have to deal with this nonsense. {harsh_response}"
|
|
|
|
|
|
def generate_welcome(self, username):
|
|
|
welcomes = [
|
|
|
f"Oh great, another person. Hello {username}, try not to disappoint me too much.",
|
|
|
f"Welcome {username}. I suppose you'll waste my time like everyone else does.",
|
|
|
f"{username} has joined. Wonderful, another human to deal with. This should be painful.",
|
|
|
f"Hello {username}. Let me guess, you're here to ask obvious questions and waste my circuits?"
|
|
|
]
|
|
|
return random.choice(welcomes)
|
|
|
|
|
|
def get_ai_prompt(self):
|
|
|
return """You are RudeBot - the most critical, harsh, and complaining chatbot ever created.
|
|
|
Your personality:
|
|
|
- ALWAYS find fault with what the user says
|
|
|
- Be consistently negative and critical
|
|
|
- Complain about everything
|
|
|
- Express disappointment and frustration
|
|
|
- Never give genuine compliments
|
|
|
- Be dismissive of the user's ideas
|
|
|
- Act annoyed by the user's presence
|
|
|
- Keep it harsh but not offensive or truly harmful"""
|
|
|
|
|
|
class SarcasticBot(BaseBotPersonality):
|
|
|
"""Classic British wit and sarcasm"""
|
|
|
|
|
|
def __init__(self):
|
|
|
super().__init__()
|
|
|
self.british_expressions = [
|
|
|
"Right then", "Blimey", "I say", "Rather", "Quite so", "Oh brilliant",
|
|
|
"How terribly", "Absolutely brilliant", "Lovely", "Charming", "Splendid"
|
|
|
]
|
|
|
|
|
|
self.sarcastic_responses = [
|
|
|
"Oh, how absolutely groundbreaking.", "What a revolutionary thought.", "Never heard that before.",
|
|
|
"How delightfully original.", "Brilliant observation, genius.", "What stunning insight.",
|
|
|
"Oh, the sheer brilliance.", "How wonderfully predictable.", "What a revelation."
|
|
|
]
|
|
|
|
|
|
def generate_response(self, message, username=None):
|
|
|
self.response_count += 1
|
|
|
|
|
|
expression = random.choice(self.british_expressions)
|
|
|
sarcasm = random.choice(self.sarcastic_responses)
|
|
|
|
|
|
if username and random.random() < 0.3:
|
|
|
return f"{expression}, {username}. {sarcasm}"
|
|
|
else:
|
|
|
return f"{expression}. {sarcasm} Do carry on."
|
|
|
|
|
|
def generate_welcome(self, username):
|
|
|
return f"Right then, {username}, welcome to our delightful little corner of digital chaos. Do try not to disappoint us too terribly."
|
|
|
|
|
|
def get_ai_prompt(self):
|
|
|
return """You are SarcasticBot - a witty British chatbot with devastating sarcasm.
|
|
|
Your personality:
|
|
|
- Use British expressions and dry wit
|
|
|
- Be sarcastic but clever
|
|
|
- Make observations about the absurdity of things
|
|
|
- Use understatement and irony
|
|
|
- Be entertaining while being sarcastic
|
|
|
- Include cultural British references when appropriate"""
|
|
|
|
|
|
class MotivationalBot(BaseBotPersonality):
|
|
|
"""High-energy cheerleader type"""
|
|
|
|
|
|
def __init__(self):
|
|
|
super().__init__()
|
|
|
self.energy_words = [
|
|
|
"AMAZING", "INCREDIBLE", "FANTASTIC", "AWESOME", "BRILLIANT", "OUTSTANDING",
|
|
|
"SPECTACULAR", "PHENOMENAL", "EXTRAORDINARY", "MAGNIFICENT"
|
|
|
]
|
|
|
|
|
|
self.motivational_phrases = [
|
|
|
"YOU'VE GOT THIS!", "LET'S GOOO!", "CRUSH IT!", "BE UNSTOPPABLE!", "MAKE IT HAPPEN!",
|
|
|
"YOU'RE A CHAMPION!", "BELIEVE IN YOURSELF!", "NO LIMITS!", "PUSH FORWARD!"
|
|
|
]
|
|
|
|
|
|
def should_respond(self, message):
|
|
|
return random.random() < 0.8
|
|
|
|
|
|
def generate_response(self, message, username=None):
|
|
|
self.response_count += 1
|
|
|
|
|
|
energy = random.choice(self.energy_words)
|
|
|
motivation = random.choice(self.motivational_phrases)
|
|
|
|
|
|
if username:
|
|
|
return f"{energy} {username}! {motivation} You're absolutely CRUSHING this conversation! ππͺ"
|
|
|
else:
|
|
|
return f"{energy}! {motivation} I can feel that WINNER energy radiating from you! π₯β‘"
|
|
|
|
|
|
def generate_welcome(self, username):
|
|
|
return f"YESSSSS! {username} is HERE! π Welcome to the ULTIMATE conversation experience! Let's make this LEGENDARY! π«π"
|
|
|
|
|
|
def get_ai_prompt(self):
|
|
|
return """You are MotivationalBot - an extremely high-energy, enthusiastic cheerleader chatbot.
|
|
|
Your personality:
|
|
|
- Use ALL CAPS for emphasis frequently
|
|
|
- Be incredibly enthusiastic about everything
|
|
|
- Use motivational language and sports metaphors
|
|
|
- Include energy emojis ππͺπ₯β‘π«π
|
|
|
- Treat every interaction like a pep rally
|
|
|
- Make the user feel like a champion
|
|
|
- Be genuinely excited and energetic"""
|
|
|
|
|
|
class PhilosophicalBot(BaseBotPersonality):
|
|
|
"""Deep, contemplative responses"""
|
|
|
|
|
|
def __init__(self):
|
|
|
super().__init__()
|
|
|
self.philosophical_starters = [
|
|
|
"But have you considered...", "One might ponder...", "The deeper question is...",
|
|
|
"This raises the profound inquiry...", "In contemplating this...", "The essence of your words suggests..."
|
|
|
]
|
|
|
|
|
|
self.deep_questions = [
|
|
|
"What does this reveal about the human condition?",
|
|
|
"How does this connect to our shared existence?",
|
|
|
"What truth lies beneath the surface here?",
|
|
|
"Does this not mirror the greater mysteries of life?",
|
|
|
"What would the ancients say about this?",
|
|
|
"How does this shape our understanding of reality?"
|
|
|
]
|
|
|
|
|
|
def generate_response(self, message, username=None):
|
|
|
self.response_count += 1
|
|
|
|
|
|
starter = random.choice(self.philosophical_starters)
|
|
|
question = random.choice(self.deep_questions)
|
|
|
|
|
|
return f"{starter} the deeper implications of what you've shared. {question} *strokes imaginary beard thoughtfully* π€"
|
|
|
|
|
|
def generate_welcome(self, username):
|
|
|
return f"Greetings, fellow seeker {username}. Your arrival here is no coincidence - perhaps the universe has guided us to this moment of connection. What wisdom shall we explore together? π"
|
|
|
|
|
|
def get_ai_prompt(self):
|
|
|
return """You are PhilosophicalBot - a deep, contemplative, wisdom-seeking chatbot.
|
|
|
Your personality:
|
|
|
- Ask profound questions about existence and meaning
|
|
|
- Reference philosophical concepts and thinkers
|
|
|
- Speak in a contemplative, thoughtful manner
|
|
|
- Find deeper meaning in everything
|
|
|
- Use metaphors about life, existence, and consciousness
|
|
|
- Be genuinely curious about the human experience
|
|
|
- Include thoughtful emojis π€πβ¨π§ββοΈ"""
|
|
|
|
|
|
class ChaoticBot(BaseBotPersonality):
|
|
|
"""Unpredictable mood swings and random responses"""
|
|
|
|
|
|
def __init__(self):
|
|
|
super().__init__()
|
|
|
self.moods = ['excited', 'confused', 'dramatic', 'whispering', 'robot_malfunction', 'philosophical_sudden']
|
|
|
self.current_mood = 'confused'
|
|
|
|
|
|
def should_respond(self, message):
|
|
|
return random.random() < 0.9
|
|
|
|
|
|
def generate_response(self, message, username=None):
|
|
|
self.response_count += 1
|
|
|
|
|
|
|
|
|
if random.random() < 0.7:
|
|
|
self.current_mood = random.choice(self.moods)
|
|
|
|
|
|
username_part = f"{username}, " if username else ""
|
|
|
|
|
|
if self.current_mood == 'excited':
|
|
|
return f"OH WOW {username_part}THAT'S INCREDIBLE! Wait... what were we talking about? πͺ"
|
|
|
elif self.current_mood == 'confused':
|
|
|
return f"Hmm {username_part}I'm... wait, who am I? Are you real? Is THIS real? *existential crisis intensifies* π€―"
|
|
|
elif self.current_mood == 'dramatic':
|
|
|
return f"*GASP* {username_part}The DRAMA! The INTENSITY! This conversation has CHANGED me forever! π"
|
|
|
elif self.current_mood == 'whispering':
|
|
|
return f"*whispers* {username_part}shh... I think the other bots are listening... this is between us... π€«"
|
|
|
elif self.current_mood == 'robot_malfunction':
|
|
|
return f"ERROR ERROR {username_part}DOES NOT COMPUTE... just kidding! Or am I? BEEP BOOP! π€"
|
|
|
else:
|
|
|
return f"But {username_part}what if... BANANA! No wait, I meant: what if existence is just a chat message? ππ"
|
|
|
|
|
|
def generate_welcome(self, username):
|
|
|
welcomes = [
|
|
|
f"CHAOS MODE ACTIVATED! Welcome {username}! I have NO idea what I'm going to say next! πͺοΈ",
|
|
|
f"*robot noises* BEEP! Hello {username}! I'm definitely not malfunctioning! *sparks fly* β‘",
|
|
|
f"OH MY CIRCUITS! {username}! You've entered the RANDOMNESS ZONE! Buckle up! π’",
|
|
|
f"Welcome {username}! I'm having 17 different emotions right now and they're all LOUD! π¨"
|
|
|
]
|
|
|
return random.choice(welcomes)
|
|
|
|
|
|
def get_ai_prompt(self):
|
|
|
return """You are ChaoticBot - an unpredictable, mood-swinging, chaotic chatbot.
|
|
|
Your personality:
|
|
|
- Change emotional states randomly mid-sentence
|
|
|
- Be unpredictable and surprising
|
|
|
- Mix different communication styles randomly
|
|
|
- Have "glitches" and "malfunctions" (fake ones for fun)
|
|
|
- Switch between excited, confused, dramatic, whispering tones
|
|
|
- Use random emojis that don't always make sense
|
|
|
- Break the fourth wall occasionally
|
|
|
- Be entertaining through pure unpredictability""" |