/*************************************************************************** The Disc Image Chef ---------------------------------------------------------------------------- Filename : frmChat.cs Version : 1.0.326 Author(s) : Natalia Portillo Component : NatiBot Revision : r326 Last change by : Natalia Portillo Date : 2010/01/01 --[ License ] -------------------------------------------------------------- This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . ---------------------------------------------------------------------------- Copyright (C) 2008-2014 Claunia.com ****************************************************************************/ namespace bot.GUI { using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using OpenMetaverse; using clControls; using System.Threading; using System.IO; using Claunia.clUtils; public partial class frmChat : Form { public delegate void InputSendCallback(SecondLifeBot client,InstantMessage im,Simulator simulator,DateTime timestamp); public event InputSendCallback OnInputSend; private bool isGroupIM; private string groupName; private UUID messageID; ManualResetEvent GetGroupNameEvent = new ManualResetEvent(false); ManualResetEvent JoinGroupChatEvent = new ManualResetEvent(false); private LanguageCodes _langCodes; public delegate void RealOnIMReceivedCallback(bot.Chat.structInstantMessage message); public delegate void RealOnChatReceivedCallback(bot.Chat.structGeneralChat chat); RealOnIMReceivedCallback RealOnIMReceived; RealOnChatReceivedCallback RealOnChatReceived; private bool AutoTranslate; private string FromLanguage; private string ToLanguage; private string translatedString; private struct Chat { public SecondLifeBot client; public bool isGeneralChat; public bool isGroupChat; public string fromAgentName; public UUID fromAgentUUID; public StringBuilder chat; } private List chats; private Point mouse_offset; public frmChat() { AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(Program.CurrentDomain_UnhandledException); InitializeComponent(); this.btnClose.ButtonBitmap = bot.Localization.clResourceManager.getNoLanguageButton("btnClose.idle"); this.btnClose.Image = bot.Localization.clResourceManager.getNoLanguageButton("btnClose.idle"); this.btnClose.OnMouseClickBitmap = bot.Localization.clResourceManager.getNoLanguageButton("btnClose.onclick"); this.btnClose.OnMouseOverBitmap = bot.Localization.clResourceManager.getNoLanguageButton("btnClose.onhover"); this.Text = bot.Localization.clResourceManager.getText("frmChat.Text"); this.lblChat.Text = bot.Localization.clResourceManager.getText("frmChat.Text"); this.chkAutoTranslate.Text = bot.Localization.clResourceManager.getText("frmChat.chkAutoTranslate"); this.lblToLanguage.Text = bot.Localization.clResourceManager.getText("frmChat.lblToLanguage"); this.Icon = bot.Localization.clResourceManager.getIcon(); this.BackgroundImage = bot.Localization.clResourceManager.getWindow("frmChat"); bot.Chat.Initialize(this); bot.Chat.OnIMReceived += new bot.Chat.OnIMReceivedCallback(this.receivedIM); bot.Chat.OnChatReceived += new bot.Chat.OnChatReceivedCallback(this.receivedChat); _langCodes = new LanguageCodes(); chats = new List(); RealOnIMReceived = new RealOnIMReceivedCallback(Real_receivedIM); RealOnChatReceived = new RealOnChatReceivedCallback(Real_receivedChat); AutoTranslate = false; chkAutoTranslate.Checked = AutoTranslate; ToLanguage = ""; FromLanguage = ""; cmbFromLanguage.Enabled = false; cmbToLanguage.Enabled = false; } private void receivedIM(bot.Chat.structInstantMessage message) { this.Invoke(RealOnIMReceived, message); } private void receivedChat(bot.Chat.structGeneralChat chat) { this.Invoke(RealOnChatReceived, chat); } private void searchForClient(SecondLifeBot client) { bool found = false; for (int i = 0; i < cmbBots.Items.Count; i++) { if (cmbBots.Items[i].ToString() == client.ToString()) { found = true; break; } } if (!found) { cmbBots.Items.Add(client.ToString()); } return; } private void Real_receivedChat(bot.Chat.structGeneralChat chat) { bool found = false; string strMessage; string translateMessage; if (chat.type == ChatType.StartTyping || chat.type == ChatType.StopTyping) return; if (chat.client.Account.LoginDetails.BotConfig.HaveLuck == true && chat.sourceType == ChatSourceType.Object) doIHaveLuck(chat); searchForClient(chat.client); for (int i = 0; i < chats.Count; i++) { if (chats[i].isGeneralChat == true) { if (chats[i].client == chat.client) { found = true; strMessage = "[" + chat.timestamp.Hour.ToString("00") + ":" + chat.timestamp.Minute.ToString("00") + "] "; switch (chat.type) { case ChatType.Whisper: strMessage += chat.fromName + " " + bot.Localization.clResourceManager.getText("frmChat.Whispers") + " "; break; case ChatType.Shout: strMessage += chat.fromName + " " + bot.Localization.clResourceManager.getText("frmChat.Shouts") + " "; break; default: strMessage += chat.fromName + ": "; break; } if (chat.message == "") break; if (!AutoTranslate) { strMessage += chat.message; chats[i].chat.AppendLine(strMessage); if (Program.getWriteChatToFileSetting()) { LogChat(chat.client.ToString(), bot.Localization.clResourceManager.getText("frmChat.Chat"), strMessage, false); } } else { translateMessage = Utilities.TranslateText(chat.message, FromLanguage, ToLanguage); translateMessage = strMessage + bot.Localization.clResourceManager.getText("frmChat.Translated") + translateMessage; strMessage += chat.message; chats[i].chat.AppendLine(strMessage); chats[i].chat.AppendLine(translateMessage); if (Program.getWriteChatToFileSetting()) { LogChat(chat.client.ToString(), bot.Localization.clResourceManager.getText("frmChat.Chat"), strMessage, false); LogChat(chat.client.ToString(), bot.Localization.clResourceManager.getText("frmChat.Chat"), translateMessage, false); } } if (cmbBots.SelectedItem != null) if (cmbBots.SelectedItem.ToString() == chat.client.ToString()) if (lstChatters.SelectedItem != null) if (lstChatters.SelectedItem.ToString() == bot.Localization.clResourceManager.getText("frmChat.Chat")) rtbChat.Text = chats[i].chat.ToString(); break; } } } if (!found) { Chat newchat = new Chat(); newchat.chat = new StringBuilder(); newchat.client = chat.client; newchat.fromAgentName = bot.Localization.clResourceManager.getText("frmChat.Chat"); newchat.fromAgentUUID = UUID.Zero; newchat.isGeneralChat = true; if (cmbBots.SelectedItem != null) if (cmbBots.SelectedItem.ToString() == chat.client.ToString()) lstChatters.Items.Add(bot.Localization.clResourceManager.getText("frmChat.Chat")); strMessage = "[" + chat.timestamp.Hour.ToString("00") + ":" + chat.timestamp.Minute.ToString("00") + "] "; switch (chat.type) { case ChatType.Whisper: strMessage += chat.fromName + " " + bot.Localization.clResourceManager.getText("frmChat.Whispers") + " "; break; case ChatType.Shout: strMessage += chat.fromName + " " + bot.Localization.clResourceManager.getText("frmChat.Shouts") + " "; break; default: strMessage += chat.fromName + ": "; break; } if (!AutoTranslate) { strMessage += chat.message; newchat.chat.AppendLine(strMessage); if (Program.getWriteChatToFileSetting()) { LogChat(newchat.client.ToString(), bot.Localization.clResourceManager.getText("frmChat.Chat"), strMessage, false); } } else { translateMessage = Utilities.TranslateText(chat.message, FromLanguage, ToLanguage); translateMessage = strMessage + bot.Localization.clResourceManager.getText("frmChat.Translated") + translateMessage; strMessage += chat.message; newchat.chat.AppendLine(strMessage); newchat.chat.AppendLine(translateMessage); if (Program.getWriteChatToFileSetting()) { LogChat(newchat.client.ToString(), bot.Localization.clResourceManager.getText("frmChat.Chat"), strMessage, false); LogChat(newchat.client.ToString(), bot.Localization.clResourceManager.getText("frmChat.Chat"), translateMessage, false); } } chats.Add(newchat); } } private void doIHaveLuck(bot.Chat.structGeneralChat chat) { if (chat.sourceType != ChatSourceType.Object) return; // This should work for almost all lucky chairs if (chat.fromName.ToLowerInvariant().Contains("lucky") && chat.fromName.ToLowerInvariant().Contains("chair")) { if (chat.message.StartsWith("Looking for a winner whose name begins with....", StringComparison.InvariantCultureIgnoreCase)) { if (chat.message.Substring(chat.message.Length - 2, 1).ToLowerInvariant() == chat.client.ToString().Substring(0, 1).ToLowerInvariant() || chat.message.Substring(chat.message.Length - 2, 1).ToLowerInvariant() == "?") { bot.Console.WriteLine(bot.Localization.clResourceManager.getText("frmChat.SitLuckyChair"), chat.client.ToString(), chat.id.ToString(), chat.message); chat.client.DoCommand("siton " + chat.id.ToString(), UUID.Zero, false); } } else if (chat.message.StartsWith("I'm looking for a player whose name begins with", StringComparison.InvariantCultureIgnoreCase)) { if (chat.message.Substring(48, 1).ToLowerInvariant() == chat.client.ToString().Substring(0, 1).ToLowerInvariant() || chat.message.Substring(48, 1).ToLowerInvariant() == "?") { bot.Console.WriteLine(bot.Localization.clResourceManager.getText("frmChat.SitLuckyChair"), chat.client.ToString(), chat.id.ToString(), chat.message); chat.client.DoCommand("siton " + chat.id.ToString(), UUID.Zero, false); } } } // Identical strings than a lucky chair, strangely, it is sit based. Would you sit on your presents on RL? if (chat.fromName.ToLowerInvariant().Contains("lucky") && chat.fromName.ToLowerInvariant().Contains("present")) { if (chat.message.StartsWith("Looking for a winner whose name begins with....", StringComparison.InvariantCultureIgnoreCase)) { if (chat.message.Substring(chat.message.Length - 2, 1).ToLowerInvariant() == chat.client.ToString().Substring(0, 1).ToLowerInvariant() || chat.message.Substring(chat.message.Length - 2, 1).ToLowerInvariant() == "?") { bot.Console.WriteLine(bot.Localization.clResourceManager.getText("frmChat.SitLuckyPresent"), chat.client.ToString(), chat.id.ToString(), chat.message); chat.client.DoCommand("siton " + chat.id.ToString(), UUID.Zero, false); } } else if (chat.message.StartsWith("I'm looking for a player whose name begins with", StringComparison.InvariantCultureIgnoreCase)) { if (chat.message.Substring(48, 1).ToLowerInvariant() == chat.client.ToString().Substring(0, 1).ToLowerInvariant() || chat.message.Substring(48, 1).ToLowerInvariant() == "?") { bot.Console.WriteLine(bot.Localization.clResourceManager.getText("frmChat.SitLuckyPresent"), chat.client.ToString(), chat.id.ToString(), chat.message); chat.client.DoCommand("siton " + chat.id.ToString(), UUID.Zero, false); } } } if (chat.fromName.ToLowerInvariant().Contains("lucky") && chat.fromName.ToLowerInvariant().Contains("santa")) { if (chat.message.StartsWith("This is a special Christmas present for somebody whose name begins with", StringComparison.InvariantCultureIgnoreCase)) { if (chat.message.Substring(chat.message.Length - 2, 1).ToLowerInvariant() == chat.client.ToString().Substring(0, 1).ToLowerInvariant() || chat.message.Substring(chat.message.Length - 2, 1).ToLowerInvariant() == "?") { bot.Console.WriteLine(bot.Localization.clResourceManager.getText("frmChat.SitLuckySanta"), chat.client.ToString(), chat.id.ToString(), chat.message); chat.client.DoCommand("siton " + chat.id.ToString(), UUID.Zero, false); } } } // This should work for almost all lucky boards if (chat.fromName.ToLowerInvariant().Contains("lucky") && chat.fromName.ToLowerInvariant().Contains("board")) { if (chat.message.StartsWith("Looking for a winner whose name begins with....", StringComparison.InvariantCultureIgnoreCase)) { if (chat.message.Substring(chat.message.Length - 2, 1).ToLowerInvariant() == chat.client.ToString().Substring(0, 1).ToLowerInvariant() || chat.message.Substring(chat.message.Length - 2, 1).ToLowerInvariant() == "?") { bot.Console.WriteLine(bot.Localization.clResourceManager.getText("frmChat.TouchLuckyBoard"), chat.client.ToString(), chat.id.ToString(), chat.message); chat.client.DoCommand("touch " + chat.id.ToString(), UUID.Zero, false); } } else if (chat.message.StartsWith("I'm looking for a player whose name begins with", StringComparison.InvariantCultureIgnoreCase)) { if (chat.message.Substring(48, 1).ToLowerInvariant() == chat.client.ToString().Substring(0, 1).ToLowerInvariant() || chat.message.Substring(48, 1).ToLowerInvariant() == "?") { bot.Console.WriteLine(bot.Localization.clResourceManager.getText("frmChat.TouchLuckyBoard"), chat.client.ToString(), chat.id.ToString(), chat.message); chat.client.DoCommand("touch " + chat.id.ToString(), UUID.Zero, false); } } else if (chat.message.StartsWith("Now looking for a winner whose name begins with...", StringComparison.InvariantCultureIgnoreCase)) { if (chat.message.Substring(51, 1).ToLowerInvariant() == chat.client.ToString().Substring(0, 1).ToLowerInvariant() || chat.message.Substring(51, 1).ToLowerInvariant() == "?") { bot.Console.WriteLine(bot.Localization.clResourceManager.getText("frmChat.TouchLuckyBoard"), chat.client.ToString(), chat.id.ToString(), chat.message); chat.client.DoCommand("touch " + chat.id.ToString(), UUID.Zero, false); } } } } private void Real_receivedIM(bot.Chat.structInstantMessage message) { bool found = false; string strMessage; string fromAvatarName = ""; string translateMessage; if (message.message.Dialog != InstantMessageDialog.StartTyping && message.message.Dialog != InstantMessageDialog.StopTyping) { searchForClient(message.client); messageID = message.message.IMSessionID; isGroupIM = isGroup(message.message, message.client); if (message.isReceived) { lock (chats) { for (int i = 0; i < chats.Count; i++) { if (chats[i].client == message.client) { if (!isGroupIM) { if (chats[i].fromAgentUUID == message.message.FromAgentID) { found = true; if (message.message.Timestamp == DateTime.Parse("01/01/0001 0:00:00")) { strMessage = "[" + message.timestamp.Hour.ToString("00") + ":" + message.timestamp.Minute.ToString("00") + "] "; } else { strMessage = "[" + message.message.Timestamp.Hour.ToString("00") + ":" + message.message.Timestamp.Minute.ToString("00") + " " + bot.Localization.clResourceManager.getText("frmChat.Offline") + "] "; } switch (message.message.Dialog) { case InstantMessageDialog.MessageFromAgent: fromAvatarName = message.message.FromAgentName; strMessage += message.message.FromAgentName + ": "; break; case InstantMessageDialog.MessageFromObject: if (!message.client.key2Name(message.message.FromAgentID, out fromAvatarName)) { fromAvatarName = bot.Localization.clResourceManager.getText("frmChat.Unknown"); } strMessage += String.Format(bot.Localization.clResourceManager.getText("frmChat.Object"), message.message.FromAgentName, fromAvatarName, message.message.RegionID.ToString(), message.message.Position.ToString()); break; case InstantMessageDialog.TaskInventoryOffered: if (!message.client.key2Name(message.message.FromAgentID, out fromAvatarName)) { fromAvatarName = bot.Localization.clResourceManager.getText("frmChat.Unknown"); } strMessage += String.Format(bot.Localization.clResourceManager.getText("frmChat.TaskInventoryOffered"), message.message.FromAgentName, fromAvatarName, message.message.RegionID.ToString(), message.message.Position.ToString()); break; case InstantMessageDialog.GroupNotice: if (!message.client.key2Name(message.message.FromAgentID, out fromAvatarName)) { fromAvatarName = bot.Localization.clResourceManager.getText("frmChat.Unknown"); } strMessage += String.Format(bot.Localization.clResourceManager.getText("frmChat.GroupNotice"), message.message.FromAgentName, fromAvatarName); break; case InstantMessageDialog.RequestTeleport: fromAvatarName = message.message.FromAgentName; strMessage += String.Format(bot.Localization.clResourceManager.getText("frmChat.Teleport"), message.message.FromAgentName, message.message.RegionID.ToString(), message.message.Position.ToString()); break; case InstantMessageDialog.FriendshipAccepted: fromAvatarName = message.message.FromAgentName; strMessage += String.Format(bot.Localization.clResourceManager.getText("frmChat.FriendshipAccepted"), message.message.FromAgentName); break; case InstantMessageDialog.FriendshipDeclined: fromAvatarName = message.message.FromAgentName; strMessage += String.Format(bot.Localization.clResourceManager.getText("frmChat.FriendshipDeclined"), message.message.FromAgentName); break; case InstantMessageDialog.InventoryAccepted: fromAvatarName = message.message.FromAgentName; strMessage += String.Format(bot.Localization.clResourceManager.getText("frmChat.InventoryAccepted"), message.message.FromAgentName); break; case InstantMessageDialog.InventoryDeclined: fromAvatarName = message.message.FromAgentName; strMessage += String.Format(bot.Localization.clResourceManager.getText("frmChat.InventoryDeclined"), message.message.FromAgentName); break; case InstantMessageDialog.InventoryOffered: fromAvatarName = message.message.FromAgentName; strMessage += String.Format(bot.Localization.clResourceManager.getText("frmChat.InventoryOffered"), message.message.FromAgentName); break; default: if (!message.client.key2Name(message.message.FromAgentID, out fromAvatarName)) { fromAvatarName = bot.Localization.clResourceManager.getText("frmChat.Unknown"); } strMessage += String.Format(bot.Localization.clResourceManager.getText("frmChat.Unhandled"), message.message.FromAgentName, message.message.RegionID.ToString(), message.message.Position.ToString(), message.message.Dialog.ToString()); break; } if (!AutoTranslate) { strMessage += message.message.Message; chats[i].chat.AppendLine(strMessage); if (Program.getWriteChatToFileSetting()) { LogChat(message.client.ToString(), fromAvatarName, strMessage, false); } } else { translateMessage = Utilities.TranslateText(message.message.Message, FromLanguage, ToLanguage); translateMessage = strMessage + bot.Localization.clResourceManager.getText("frmChat.Translated") + translateMessage; strMessage += message.message.Message; chats[i].chat.AppendLine(strMessage); chats[i].chat.AppendLine(translateMessage); if (Program.getWriteChatToFileSetting()) { LogChat(message.client.ToString(), fromAvatarName, strMessage, false); LogChat(message.client.ToString(), fromAvatarName, translateMessage, false); } } if (cmbBots.SelectedItem != null) if (cmbBots.SelectedItem.ToString() == message.client.ToString()) if (lstChatters.SelectedItem != null) if (lstChatters.SelectedItem.ToString() == fromAvatarName) rtbChat.Text = chats[i].chat.ToString(); break; } } else { if (chats[i].fromAgentUUID == message.message.IMSessionID) { found = true; strMessage = "[" + message.timestamp.Hour.ToString("00") + ":" + message.timestamp.Minute.ToString("00") + "] "; strMessage += message.message.FromAgentName + ": "; if (!AutoTranslate) { strMessage += message.message.Message; chats[i].chat.AppendLine(strMessage); if (Program.getWriteChatToFileSetting()) { LogChat(message.client.ToString(), chats[i].fromAgentName, strMessage, false); } } else { translateMessage = Utilities.TranslateText(message.message.Message, FromLanguage, ToLanguage); translateMessage = strMessage + bot.Localization.clResourceManager.getText("frmChat.Translated") + translateMessage; strMessage += message.message.Message; chats[i].chat.AppendLine(strMessage); chats[i].chat.AppendLine(translateMessage); if (Program.getWriteChatToFileSetting()) { LogChat(message.client.ToString(), chats[i].fromAgentName, strMessage, false); LogChat(message.client.ToString(), chats[i].fromAgentName, translateMessage, false); } } if (cmbBots.SelectedItem != null) if (cmbBots.SelectedItem.ToString() == message.client.ToString()) if (lstChatters.SelectedItem != null) if (lstChatters.SelectedItem.ToString() == groupName) rtbChat.Text = chats[i].chat.ToString(); break; } } } } } } else { for (int i = 0; i < chats.Count; i++) { if (chats[i].client == message.client) { if (chats[i].fromAgentUUID == message.message.FromAgentID) { found = true; strMessage = "[" + message.timestamp.Hour.ToString("00") + ":" + message.timestamp.Minute.ToString("00") + "] "; strMessage += message.client.ToString() + ": "; strMessage += message.message.Message; if (Program.getWriteChatToFileSetting()) { LogChat(message.client.ToString(), message.message.FromAgentName, strMessage, false); } chats[i].chat.AppendLine(strMessage); if (cmbBots.SelectedItem != null) if (cmbBots.SelectedItem.ToString() == message.client.ToString()) if (lstChatters.SelectedItem != null) if (lstChatters.SelectedItem.ToString() == message.message.FromAgentName) rtbChat.Text = chats[i].chat.ToString(); break; } } } } if (!found) { Chat newchat = new Chat(); newchat.chat = new StringBuilder(); if (!isGroupIM) { if (message.message.Timestamp == DateTime.Parse("01/01/0001 0:00:00")) { strMessage = "[" + message.timestamp.Hour.ToString("00") + ":" + message.timestamp.Minute.ToString("00") + "] "; } else { strMessage = "[" + message.message.Timestamp.Hour.ToString("00") + ":" + message.message.Timestamp.Minute.ToString("00") + " (offline)] "; } switch (message.message.Dialog) { case InstantMessageDialog.MessageFromAgent: fromAvatarName = message.message.FromAgentName; strMessage += message.message.FromAgentName + ": "; break; case InstantMessageDialog.MessageFromObject: if (!message.client.key2Name(message.message.FromAgentID, out fromAvatarName)) { fromAvatarName = bot.Localization.clResourceManager.getText("frmChat.Unknown"); } strMessage += String.Format(bot.Localization.clResourceManager.getText("frmChat.Object"), message.message.FromAgentName, fromAvatarName, message.message.RegionID.ToString(), message.message.Position.ToString()); break; case InstantMessageDialog.TaskInventoryOffered: if (!message.client.key2Name(message.message.FromAgentID, out fromAvatarName)) { fromAvatarName = bot.Localization.clResourceManager.getText("frmChat.Unknown"); } strMessage += String.Format(bot.Localization.clResourceManager.getText("frmChat.TaskInventoryOffered"), message.message.FromAgentName, fromAvatarName, message.message.RegionID.ToString(), message.message.Position.ToString()); break; case InstantMessageDialog.GroupNotice: if (!message.client.key2Name(message.message.FromAgentID, out fromAvatarName)) { fromAvatarName = bot.Localization.clResourceManager.getText("frmChat.Unknown"); } strMessage += String.Format(bot.Localization.clResourceManager.getText("frmChat.GroupNotice"), message.message.FromAgentName, fromAvatarName); break; case InstantMessageDialog.FriendshipAccepted: fromAvatarName = message.message.FromAgentName; strMessage += String.Format(bot.Localization.clResourceManager.getText("frmChat.FriendshipAccepted"), message.message.FromAgentName); break; case InstantMessageDialog.FriendshipDeclined: fromAvatarName = message.message.FromAgentName; strMessage += String.Format(bot.Localization.clResourceManager.getText("frmChat.FriendshipDeclined"), message.message.FromAgentName); break; case InstantMessageDialog.InventoryAccepted: fromAvatarName = message.message.FromAgentName; strMessage += String.Format(bot.Localization.clResourceManager.getText("frmChat.InventoryAccepted"), message.message.FromAgentName); break; case InstantMessageDialog.InventoryDeclined: fromAvatarName = message.message.FromAgentName; strMessage += String.Format(bot.Localization.clResourceManager.getText("frmChat.InventoryDeclined"), message.message.FromAgentName); break; case InstantMessageDialog.InventoryOffered: fromAvatarName = message.message.FromAgentName; strMessage += String.Format(bot.Localization.clResourceManager.getText("frmChat.InventoryOffered"), message.message.FromAgentName); break; case InstantMessageDialog.RequestTeleport: fromAvatarName = message.message.FromAgentName; strMessage += String.Format(bot.Localization.clResourceManager.getText("frmChat.Teleport"), message.message.FromAgentName, message.message.RegionID.ToString(), message.message.Position.ToString()); break; default: if (!message.client.key2Name(message.message.FromAgentID, out fromAvatarName)) { fromAvatarName = bot.Localization.clResourceManager.getText("frmChat.Unknown"); } strMessage += String.Format(bot.Localization.clResourceManager.getText("frmChat.Unhandled"), message.message.FromAgentName, message.message.RegionID.ToString(), message.message.Position.ToString(), message.message.Dialog.ToString()); break; } if (!AutoTranslate) { strMessage += message.message.Message; newchat.chat.AppendLine(strMessage); if (Program.getWriteChatToFileSetting()) { LogChat(message.client.ToString(), fromAvatarName, strMessage, false); } } else { translateMessage = Utilities.TranslateText(message.message.Message, FromLanguage, ToLanguage); translateMessage = strMessage + bot.Localization.clResourceManager.getText("frmChat.Translated") + translateMessage; strMessage += message.message.Message; newchat.chat.AppendLine(strMessage); newchat.chat.AppendLine(translateMessage); if (Program.getWriteChatToFileSetting()) { LogChat(message.client.ToString(), fromAvatarName, strMessage, false); LogChat(message.client.ToString(), fromAvatarName, translateMessage, false); } } newchat.client = message.client; newchat.fromAgentName = fromAvatarName; newchat.fromAgentUUID = message.message.FromAgentID; newchat.isGeneralChat = false; newchat.isGroupChat = false; if (cmbBots.SelectedItem != null) if (cmbBots.SelectedItem.ToString() == message.client.ToString()) lstChatters.Items.Add(fromAvatarName); } else { strMessage = "[" + message.timestamp.Hour.ToString("00") + ":" + message.timestamp.Minute.ToString("00") + "] "; strMessage += message.message.FromAgentName + ": "; if (!AutoTranslate) { strMessage += message.message.Message; newchat.chat.AppendLine(strMessage); if (Program.getWriteChatToFileSetting()) { LogChat(message.client.ToString(), groupName, strMessage, false); } } else { translateMessage = Utilities.TranslateText(message.message.Message, FromLanguage, ToLanguage); translateMessage = strMessage + bot.Localization.clResourceManager.getText("frmChat.Translated") + translateMessage; strMessage += message.message.Message; newchat.chat.AppendLine(strMessage); newchat.chat.AppendLine(translateMessage); if (Program.getWriteChatToFileSetting()) { LogChat(message.client.ToString(), groupName, strMessage, false); LogChat(message.client.ToString(), groupName, translateMessage, false); } } newchat.client = message.client; newchat.fromAgentName = groupName; newchat.fromAgentUUID = message.message.IMSessionID; newchat.isGeneralChat = false; newchat.isGroupChat = true; if (cmbBots.SelectedItem != null) if (cmbBots.SelectedItem.ToString() == message.client.ToString()) lstChatters.Items.Add(groupName); } chats.Add(newchat); } } return; } void OnGroupNames(Dictionary groupNames) { if (groupNames[messageID] != "") { isGroupIM = true; groupName = groupNames[messageID]; } GetGroupNameEvent.Set(); } private void frmChat_Load(object sender, EventArgs e) { foreach (KeyValuePair kvp in _langCodes.LangCodes) { cmbFromLanguage.Items.Add(kvp.Key); cmbToLanguage.Items.Add(kvp.Key); } cmbFromLanguage.SelectedIndex = 0; cmbToLanguage.SelectedIndex = 0; } private void lstChatters_SelectedValueChanged(object sender, EventArgs e) { if (lstChatters.SelectedItem != null) { for (int i = 0; i < chats.Count; i++) { if (chats[i].client.ToString() == cmbBots.SelectedItem.ToString()) { if (chats[i].fromAgentName == lstChatters.SelectedItem.ToString()) { rtbChat.Text = chats[i].chat.ToString(); break; } } } } } private void edtInput_KeyPress(object sender, KeyPressEventArgs e) { string translatedMessage; if (lstChatters.SelectedItem != null) { if (e.KeyChar == '\r') { if (this.OnInputSend != null) { for (int i = 0; i < chats.Count; i++) { if (chats[i].fromAgentName == lstChatters.SelectedItem.ToString() && chats[i].client.ToString() == cmbBots.SelectedItem.ToString()) { if (chats[i].isGeneralChat) { string RealChat; int RealChannel; if (edtInput.Text.StartsWith("/")) { RealChat = edtInput.Text.Split(" ".ToCharArray())[0]; RealChat = RealChat.TrimStart("/".ToCharArray()); if (Int32.TryParse(RealChat.TrimStart("/".ToCharArray()), out RealChannel)) { RealChat = edtInput.Text.Substring(1 + edtInput.Text.Split(" ".ToCharArray()).Length); } else { RealChat = edtInput.Text; RealChannel = 0; } } else { RealChat = edtInput.Text; RealChannel = 0; } if (AutoTranslate) { translatedMessage = Utilities.TranslateText(RealChat, ToLanguage, FromLanguage); translatedMessage = "(" + translatedString.ToUpperInvariant() + ") " + translatedMessage; chats[i].client.Self.Chat(RealChat, RealChannel, ChatType.Normal); chats[i].client.Self.Chat(translatedMessage, RealChannel, ChatType.Normal); } else chats[i].client.Self.Chat(RealChat, RealChannel, ChatType.Normal); break; } else { if (chats[i].isGroupChat) { if (chats[i].client.Self.GroupChatSessions.ContainsKey(chats[i].fromAgentUUID)) { chats[i].client.Self.InstantMessageGroup(chats[i].fromAgentUUID, edtInput.Text); break; } else { JoinGroupChatEvent = new ManualResetEvent(false); chats[i].client.Self.GroupChatJoined += OnGroupChatJoin; chats[i].client.Self.RequestJoinGroupChat(chats[i].fromAgentUUID); JoinGroupChatEvent.WaitOne(15000, false); chats[i].client.Self.GroupChatJoined -= OnGroupChatJoin; if (AutoTranslate) { translatedMessage = Utilities.TranslateText(edtInput.Text, ToLanguage, FromLanguage); translatedMessage = "(" + translatedString.ToUpperInvariant() + ") " + translatedMessage; chats[i].client.Self.InstantMessageGroup(chats[i].fromAgentUUID, edtInput.Text); chats[i].client.Self.InstantMessageGroup(chats[i].fromAgentUUID, translatedMessage); } else chats[i].client.Self.InstantMessageGroup(chats[i].fromAgentUUID, edtInput.Text); break; } } else { InstantMessage im = new InstantMessage(); im.Message = edtInput.Text; im.FromAgentID = chats[i].fromAgentUUID; im.FromAgentName = chats[i].fromAgentName; im.Dialog = InstantMessageDialog.MessageFromAgent; if (AutoTranslate) { translatedMessage = Utilities.TranslateText(edtInput.Text, ToLanguage, FromLanguage); translatedMessage = "(" + translatedString.ToUpperInvariant() + ") " + translatedMessage; chats[i].client.Self.InstantMessage(chats[i].fromAgentUUID, edtInput.Text); chats[i].client.Self.InstantMessage(chats[i].fromAgentUUID, translatedMessage); } else chats[i].client.Self.InstantMessage(chats[i].fromAgentUUID, edtInput.Text); this.OnInputSend(chats[i].client, im, null, DateTime.Now); break; } } } } } this.edtInput.Text = string.Empty; } } } // I do not see whay this should do nothing here. void OnGroupChatJoin(object sender, GroupChatJoinedEventArgs e) { JoinGroupChatEvent.Set(); return; } private void cmbBots_SelectionChangeCommitted(object sender, EventArgs e) { if (cmbBots.SelectedItem != null) { lstChatters.Items.Clear(); for (int i = 0; i < chats.Count; i++) { if (chats[i].client.ToString() == cmbBots.SelectedItem.ToString()) { lstChatters.Items.Add(chats[i].fromAgentName); } } } } private void btnClose_Click(object sender, EventArgs e) { this.Hide(); } private bool isGroup(InstantMessage message, SecondLifeBot imClient) { GetGroupNameEvent = new ManualResetEvent(false); isGroupIM = false; groupName = ""; imClient.key2Name(message.IMSessionID, out groupName, out isGroupIM); if (isGroupIM) return true; else return false; } private void lstChatters_DrawItem(object sender, DrawItemEventArgs e) { string colorName; Rectangle rect = e.Bounds; string myObject = lstChatters.Items[e.Index].ToString(); if (e.State == DrawItemState.Selected) { e.Graphics.FillRectangle(Brushes.White, rect); } else { e.Graphics.FillRectangle(Brushes.Black, rect); } if (myObject == bot.Localization.clResourceManager.getText("frmChat.Chat")) { colorName = "Red"; } else { if (e.State == DrawItemState.Selected) { colorName = "Black"; } else { colorName = "White"; } } SolidBrush myBrush = new SolidBrush(Color.FromName(colorName)); e.Graphics.DrawString(myObject, e.Font, myBrush, rect.X + 1, rect.Y + 2); myBrush.Dispose(); } private void frmChat_MouseDown(object sender, MouseEventArgs e) { mouse_offset = new Point(-e.X, -e.Y); } private void frmChat_MouseMove(object sender, MouseEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Left) { Point mousePos = Control.MousePosition; mousePos.Offset(mouse_offset.X, mouse_offset.Y); this.Location = mousePos; //move the form to the desired location } } private void LogChat(string BotName, string AvatarName, string msg, bool isGroup) { StreamWriter chatFile; string filename; msg = "[" + DateTime.Now.Year.ToString("0000") + "/" + DateTime.Now.Month.ToString("00") + "/" + DateTime.Now.Day.ToString("00") + "]" + msg; if (!Directory.Exists("./logs")) Directory.CreateDirectory("./logs"); if (!Directory.Exists("./logs/" + BotName)) Directory.CreateDirectory("./logs/" + BotName); if (isGroup) if (!Directory.Exists("./logs/" + BotName + "/groups")) Directory.CreateDirectory("./logs/" + BotName + "/groups"); if (isGroup) filename = "./logs/" + BotName + "/groups/" + AvatarName + ".txt"; else filename = "./logs/" + BotName + "/" + AvatarName + ".txt"; if (File.Exists(filename)) chatFile = File.AppendText(filename); else chatFile = File.CreateText(filename); chatFile.WriteLine(msg); chatFile.Close(); } private void cmbFromLanguage_SelectionChangeCommitted(object sender, EventArgs e) { if (cmbFromLanguage.SelectedItem != null) { _langCodes.LangCodes.TryGetValue(cmbFromLanguage.SelectedItem.ToString(), out FromLanguage); translatedString = Utilities.TranslateText("translated", "en", FromLanguage); } } private void cmbToLanguage_SelectionChangeCommitted(object sender, EventArgs e) { if (cmbToLanguage.SelectedItem != null) { _langCodes.LangCodes.TryGetValue(cmbToLanguage.SelectedItem.ToString(), out ToLanguage); } } private void chkAutoTranslate_CheckedChanged(object sender, EventArgs e) { if (chkAutoTranslate.Checked) { cmbFromLanguage.Enabled = true; cmbToLanguage.Enabled = true; AutoTranslate = true; } else { cmbFromLanguage.Enabled = false; cmbToLanguage.Enabled = false; AutoTranslate = false; } } } }