LIVE
👥 500
Animated GIF of a person crying
STREAM CHAT

Dawwny_

Playing: Baldur's Gate 3

RPG D&D First Playthrough Casual

Join Dawwny on his first adventure in Baldur's Gate 3! Watch as he explores the Forgotten Realms, makes crucial decisions, and probably romances every NPC he meets. Come for the gameplay, stay for the laughs and community!

Schedule

Recent Clips

Thumbnail of Dawwny's character casting a powerful spell, comic book style

Epic Magic Moment!

Thumbnail of Dawwny reacting to a plot twist, anime style

Dawwny's Mind Blown

Thumbnail of Dawwny's party engaging in dialogue, oil painting style

Intense Roleplay Scene

// Initialize GUN const gun = Gun(['https://gun-manhattan.herokuapp.com/gun']); // Get references to DOM elements const chatBox = document.getElementById('chat-box'); const viewerCount = document.getElementById('viewer-count'); const chatInput = document.getElementById('chat-input'); // Initialize chat data const chat = gun.get('dawwny_chat'); const viewerData = gun.get('dawwny_viewers'); // Initialize user data let currentUser = { name: 'User' + Math.floor(Math.random() * 1000), color: '#' + Math.floor(Math.random()*16777215).toString(16), mod: false }; // Set to store message IDs to prevent duplicates const messageIds = new Set(); // Function to add a new chat message function addChatMessage(message, id) { if (messageIds.has(id)) { return; // Skip if message already displayed } messageIds.add(id); const chatMessage = document.createElement('div'); chatMessage.className = 'chat-message'; let badgeHTML = ''; if (message.mod) { badgeHTML = 'Moderator Badge'; } chatMessage.innerHTML = `${badgeHTML}${message.name}: ${message.text}`; chatBox.appendChild(chatMessage); chatBox.scrollTop = chatBox.scrollHeight; // Remove old messages if there are too many while (chatBox.children.length > 100) { chatBox.removeChild(chatBox.firstChild); } } // Listen for new chat messages chat.map().on(function(message, id) { if (message && message.timestamp > Date.now() - 60000) { // Only show messages from the last minute addChatMessage(message, id); } }); // Function to send a new chat message function sendChatMessage(text) { const message = { name: currentUser.name, color: currentUser.color, mod: currentUser.mod, text: text, timestamp: Date.now() }; chat.set(message); } // Handle chat input chatInput.addEventListener('keypress', function(e) { if (e.key === 'Enter') { const message = chatInput.value.trim(); if (message) { sendChatMessage(message); chatInput.value = ''; } } }); // Simulate other chatters const chatters = [ { name: 'BG3Lover', color: '#FF4500', mod: false }, { name: 'TavernTales', color: '#0000FF', mod: false }, { name: 'MindFlayerMaster', color: '#8A2BE2', mod: false }, { name: 'LarianFanboy', color: '#20B2AA', mod: false }, { name: 'DnDMaster', color: '#DAA520', mod: true }, { name: 'FaerunExplorer', color: '#FF69B4', mod: false }, { name: 'CriticalRoller', color: '#32CD32', mod: false }, { name: 'GithyankiGal', color: '#1E90FF', mod: false }, { name: 'AvernusAdventurer', color: '#FF6347', mod: false }, { name: 'ShadowheartsSimp', color: '#ADFF2F', mod: true }, { name: 'TieflingTrouble', color: '#8B4513', mod: false }, { name: 'BaldursGateVeteran', color: '#4B0082', mod: false }, { name: 'DrowRanger', color: '#FF1493', mod: false }, { name: 'WizardOfWinesTTV', color: '#00CED1', mod: false }, { name: 'OwlbearWhisperer', color: '#FFA07A', mod: false } ]; const emotes = ['😂', '👀', '😱', '🎉', '👏', '🤔', '😍', '🤣', '💀', '🔥', '🙌', '😮', '👍', '🤯', '💪', 'PogChamp', 'LUL', 'Kappa', 'GlitchCat', 'BibleThump']; function getRandomChatter() { return chatters[Math.floor(Math.random() * chatters.length)]; } async function getChatMessage(context) { const response = await fetch('https://websim.ai/api/chat', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ prompt: `Generate a single, short Twitch chat message for a stream of a guy named Dawwny playing Baldur's Gate 3 for the first time. The message should be relevant to the game, supportive, or a reaction to gameplay. Keep it under 100 characters. Context: ${context}`, }), }); const data = await response.json(); return data.message; } async function simulateChatMessage() { let chatter = getRandomChatter(); let message = ''; // 40% chance for an emote-only message if (Math.random() < 0.4) { const emoteCount = Math.floor(Math.random() * 3) + 1; message = Array(emoteCount).fill().map(() => emotes[Math.floor(Math.random() * emotes.length)]).join(' '); } else { const topics = ['character creation', 'dialogue choices', 'combat strategy', 'party composition', 'romance options', 'quest decisions', 'class abilities', 'hidden secrets', 'plot twists', 'D&D lore']; const context = `Talking about ${topics[Math.floor(Math.random() * topics.length)]}`; message = await getChatMessage(context); } chat.set({ name: chatter.name, color: chatter.color, mod: chatter.mod, text: message, timestamp: Date.now() }); } function updateViewerCount() { viewerData.once((data) => { let viewers = data ? data.count : 500; // Gradually increase viewers if (Math.random() < 0.8) { viewers += Math.floor(Math.random() * 3) + 1; } else { viewers -= Math.floor(Math.random() * 2); } viewers = Math.max(500, viewers); // Ensure viewer count doesn't go below 500 viewerData.put({ count: viewers }); viewerCount.textContent = `👥 ${viewers}`; // Adjust chat frequency based on viewer count adjustChatFrequency(viewers); }); } // Listen for viewer count updates viewerData.on((data) => { if (data && data.count) { viewerCount.textContent = `👥 ${data.count}`; } }); let chatInterval; function adjustChatFrequency(viewers) { // Clear existing interval if (chatInterval) { clearInterval(chatInterval); } // Calculate new chat frequency based on viewer count const baseInterval = 2000; // 2 seconds const minInterval = 100; // 0.1 seconds const newInterval = Math.max(minInterval, baseInterval - (viewers - 500) / 2); // Set new interval for chat simulation chatInterval = setInterval(() => { simulateChatMessage(); }, newInterval); } // Initial setup updateViewerCount(); // Update viewer count every 30 seconds setInterval(updateViewerCount, 30000); // Initial chat frequency adjustment adjustChatFrequency(500); // Add some initial messages to simulate an active chat const initialMessages = [ "Hey everyone! Ready for some Baldur's Gate 3 action?", "Dawwny, what class are you playing this time?", "I hope we get to see some cool magic effects!", "Don't forget to save often, Dawwny!", "Let's see those epic dialogue choices!" ]; initialMessages.forEach((msg, index) => { setTimeout(() => { sendChatMessage(msg); }, index * 1000); }); // Function to handle game-specific events function triggerGameEvent(eventType) { let eventMessage = ""; switch(eventType) { case "criticalHit": eventMessage = "Dawwny just landed a critical hit! 🎯🔥"; break; case "characterDeath": eventMessage = "Oh no! One of Dawwny's party members just died! 💀😱"; break; case "plotTwist": eventMessage = "Whoa! Did anyone see that plot twist coming? 🤯"; break; case "romanceScene": eventMessage = "Ooh, Dawwny's character is getting some action! 😏❤️"; break; } if (eventMessage) { sendChatMessage(eventMessage); } } // Simulate random game events setInterval(() => { const events = ["criticalHit", "characterDeath", "plotTwist", "romanceScene"]; const randomEvent = events[Math.floor(Math.random() * events.length)]; triggerGameEvent(randomEvent); }, 60000); // Trigger a random event every minute