Files
NatiBot/SLBot/bot/NetCom/NetCommunication.cs
2014-09-04 04:26:22 +01:00

579 lines
20 KiB
C#

/***************************************************************************
The Disc Image Chef
----------------------------------------------------------------------------
Filename : NetCommunication.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 <http://www.gnu.org/licenses/>.
----------------------------------------------------------------------------
Copyright (C) 2008-2014 Claunia.com
****************************************************************************/
namespace bot.NetCom
{
using bot;
using OpenMetaverse;
using OpenMetaverse.Packets;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
public class NetCommunication
{
private const string BetaGridLogin = "https://login.aditi.lindenlab.com/cgi-bin/login.cgi";
private SecondLifeBot client;
private bool loggedIn;
private bool loggingIn;
private bot.LoginDetails loginDetails;
private const string MainGridLogin = "https://login.agni.lindenlab.com/cgi-bin/login.cgi";
private ISynchronizeInvoke netcomSync;
private bool teleporting;
public event EventHandler<AlertMessageEventArgs> AlertMessageReceived;
public event EventHandler<ChatEventArgs> ChatReceived;
public event EventHandler<ChatSentEventArgs> ChatSent;
public event EventHandler<ClientDisconnectEventArgs> ClientDisconnected;
public event EventHandler ClientLoggedOut;
public event EventHandler<OverrideEventArgs> ClientLoggingIn;
public event EventHandler<OverrideEventArgs> ClientLoggingOut;
public event EventHandler<ClientLoginEventArgs> ClientLoginStatus;
public event EventHandler<InstantMessageEventArgs> InstantMessageReceived;
public event EventHandler<InstantMessageSentEventArgs> InstantMessageSent;
public event EventHandler<MoneyBalanceEventArgs> MoneyBalanceUpdated;
public event EventHandler<TeleportingEventArgs> Teleporting;
public event EventHandler<TeleportStatusEventArgs> TeleportStatusChanged;
public NetCommunication(SecondLifeBot client)
{
this.client = client;
this.loginDetails = client.LoginDetails;
this.AddClientEvents();
this.AddPacketCallbacks();
}
private void AddClientEvents()
{
//this.client.Self.OnChat += new AgentManager.ChatCallback(this.Self_OnChat);
//this.client.Self.OnInstantMessage += new AgentManager.InstantMessageCallback(this.Self_OnInstantMessage);
//this.client.Self.OnBalanceUpdated += new AgentManager.BalanceCallback(this.Avatar_OnBalanceUpdated);
//this.client.Self.OnTeleport += new AgentManager.TeleportCallback(this.Self_OnTeleport);
this.client.Self.TeleportProgress += new EventHandler<TeleportEventArgs>(this.Self_TeleportProgress);
this.client.Network.SimConnected += new EventHandler<SimConnectedEventArgs>(this.Network_OnConnected);
//this.client.Network.OnConnected += new NetworkManager.ConnectedCallback(this.Network_OnConnected);
//this.client.Network.OnDisconnected += new NetworkManager.DisconnectedCallback(this.Network_OnDisconnected);
this.client.Network.Disconnected += new EventHandler<DisconnectedEventArgs>(this.Network_OnDisconnected);
this.client.Network.LoginProgress += new EventHandler<LoginProgressEventArgs>(this.Network_OnLogin);
//this.client.Network.OnLogin += new NetworkManager.LoginCallback(this.Network_OnLogin);
this.client.Network.LoggedOut += new EventHandler<LoggedOutEventArgs>(this.Network_OnLogoutReply);
//this.client.Network.OnLogoutReply += new NetworkManager.LogoutCallback(this.Network_OnLogoutReply);
}
private void AddPacketCallbacks()
{
this.client.Network.RegisterCallback(PacketType.AlertMessage, this.AlertMessageHandler);
}
private void AlertMessageHandler(object sender, PacketReceivedEventArgs e)
{
if (e.Packet.Type == PacketType.AlertMessage)
{
AlertMessagePacket packet2 = (AlertMessagePacket)e.Packet;
AlertMessageEventArgs f = new AlertMessageEventArgs(Utils.BytesToString(packet2.AlertData.Message));
if (this.netcomSync != null)
{
this.netcomSync.BeginInvoke(new OnAlertMessageRaise(this.OnAlertMessageReceived), new object[] { f });
}
else
{
this.OnAlertMessageReceived(f);
}
}
}
private void Avatar_OnBalanceUpdated(int balance)
{
MoneyBalanceEventArgs e = new MoneyBalanceEventArgs(balance);
if (this.netcomSync != null)
{
this.netcomSync.BeginInvoke(new OnMoneyBalanceRaise(this.OnMoneyBalanceUpdated), new object[] { e });
}
else
{
this.OnMoneyBalanceUpdated(e);
}
}
public void ChatOut(string chat, ChatType type, int channel)
{
if (this.loggedIn)
{
this.client.Self.Chat(chat, channel, type);
this.OnChatSent(new ChatSentEventArgs(chat, type, channel));
}
}
public string generateMAC()
{
Random random = new Random(15);
string str = "";
for (int i = 0; i < 0x20; i++)
{
str = str + this.sm_int_to_hex(random.Next(15));
}
return str;
}
public void Login()
{
this.loggingIn = true;
OverrideEventArgs e = new OverrideEventArgs();
this.OnClientLoggingIn(e);
if (e.Cancel)
{
this.loggingIn = false;
}
else
{
string password;
if ((string.IsNullOrEmpty(this.loginDetails.FirstName) || string.IsNullOrEmpty(this.loginDetails.LastName)) || string.IsNullOrEmpty(this.loginDetails.Password))
{
//CLAUNIA: TRANSLATE ME
this.OnClientLoginStatus(new ClientLoginEventArgs(LoginStatus.Failed, "One or more fields are blank."));
}
string startLocation = string.Empty;
if ((this.LoginDetails.StartLocation != "home") && (this.LoginDetails.StartLocation != "last"))
{
StartLocationParser parser = new StartLocationParser(this.loginDetails.StartLocation.Trim());
startLocation = NetworkManager.StartLocation(parser.Sim, parser.X, parser.Y, parser.Z);
}
else
{
startLocation = this.LoginDetails.StartLocation;
}
if (this.loginDetails.IsPasswordMD5)
{
password = this.loginDetails.Password;
}
else
{
password = Utils.MD5(this.loginDetails.Password);
}
LoginParams loginParams = this.client.Network.DefaultLoginParams(this.loginDetails.FirstName, this.loginDetails.LastName, password, this.loginDetails.UserAgent, this.loginDetails.Author);
loginParams.Start = startLocation;
if (this.LoginDetails.GridCustomLoginUri == "")
{
System.Windows.Forms.MessageBox.Show(bot.Localization.clResourceManager.getText("NetCom.Updating.Line1") + System.Environment.NewLine +
bot.Localization.clResourceManager.getText("NetCom.Updating.Line2") + System.Environment.NewLine +
bot.Localization.clResourceManager.getText("NetCom.Updating.Line3"));
this.client.Settings.LOGIN_SERVER = "https://login.agni.lindenlab.com/cgi-bin/login.cgi";
}
this.client.Settings.LOGIN_SERVER = this.loginDetails.GridCustomLoginUri;
loginParams.URI = this.client.Settings.LOGIN_SERVER;
this.client.Network.BeginLogin(loginParams);
}
}
public void Logout()
{
if (!this.loggedIn)
{
this.OnClientLoggedOut(EventArgs.Empty);
}
else
{
OverrideEventArgs e = new OverrideEventArgs();
this.OnClientLoggingOut(e);
if (!e.Cancel)
{
this.client.Network.Logout();
}
}
}
private void Network_OnConnected(object sender, SimConnectedEventArgs e)
{
this.client.Self.RequestBalance();
this.client.Appearance.SetPreviousAppearance(false);
}
private void Network_OnDisconnected(object sender, DisconnectedEventArgs e)
{
if (this.loggedIn)
{
this.loggedIn = false;
ClientDisconnectEventArgs f = new ClientDisconnectEventArgs(e.Reason, e.Message);
if (this.netcomSync != null)
{
this.netcomSync.BeginInvoke(new OnClientDisconnectRaise(this.OnClientDisconnected), new object[] { f });
}
else
{
this.OnClientDisconnected(f);
}
}
}
private void Network_OnLogin(object sender, LoginProgressEventArgs e)
{
if (e.Status == LoginStatus.Success)
{
this.loggedIn = true;
}
ClientLoginEventArgs f = new ClientLoginEventArgs(e.Status, e.Message);
if (this.netcomSync != null)
{
this.netcomSync.BeginInvoke(new OnClientLoginRaise(this.OnClientLoginStatus), new object[] { f });
}
else
{
this.OnClientLoginStatus(f);
}
}
private void Network_OnLogoutReply(object sender, LoggedOutEventArgs e)
{
this.loggedIn = false;
if (this.netcomSync != null)
{
this.netcomSync.BeginInvoke(new OnClientLogoutRaise(this.OnClientLoggedOut), new object[] { EventArgs.Empty });
}
else
{
this.OnClientLoggedOut(EventArgs.Empty);
}
}
protected virtual void OnAlertMessageReceived(AlertMessageEventArgs e)
{
if (this.AlertMessageReceived != null)
{
this.AlertMessageReceived(this, e);
}
}
protected virtual void OnChatReceived(ChatEventArgs e)
{
if (this.ChatReceived != null)
{
this.ChatReceived(this, e);
}
}
protected virtual void OnChatSent(ChatSentEventArgs e)
{
if (this.ChatSent != null)
{
this.ChatSent(this, e);
}
}
protected virtual void OnClientDisconnected(ClientDisconnectEventArgs e)
{
if (this.ClientDisconnected != null)
{
this.ClientDisconnected(this, e);
}
}
protected virtual void OnClientLoggedOut(EventArgs e)
{
if (this.ClientLoggedOut != null)
{
this.ClientLoggedOut(this, e);
}
}
protected virtual void OnClientLoggingIn(OverrideEventArgs e)
{
if (this.ClientLoggingIn != null)
{
this.ClientLoggingIn(this, e);
}
}
protected virtual void OnClientLoggingOut(OverrideEventArgs e)
{
if (this.ClientLoggingOut != null)
{
this.ClientLoggingOut(this, e);
}
}
protected virtual void OnClientLoginStatus(ClientLoginEventArgs e)
{
if (this.ClientLoginStatus != null)
{
this.ClientLoginStatus(this, e);
}
}
protected virtual void OnInstantMessageReceived(InstantMessageEventArgs e)
{
if (this.InstantMessageReceived != null)
{
this.InstantMessageReceived(this, e);
}
}
protected virtual void OnInstantMessageSent(InstantMessageSentEventArgs e)
{
if (this.InstantMessageSent != null)
{
this.InstantMessageSent(this, e);
}
}
protected virtual void OnMoneyBalanceUpdated(MoneyBalanceEventArgs e)
{
if (this.MoneyBalanceUpdated != null)
{
this.MoneyBalanceUpdated(this, e);
}
}
protected virtual void OnTeleporting(TeleportingEventArgs e)
{
if (this.Teleporting != null)
{
this.Teleporting(this, e);
}
}
protected virtual void OnTeleportStatusChanged(TeleportEventArgs e)
{
if (this.TeleportStatusChanged != null)
{
TeleportStatusEventArgs f = new TeleportStatusEventArgs(e.Message, e.Status, e.Flags);
this.TeleportStatusChanged(this, f);
}
}
private void Self_OnChat(string message, ChatAudibleLevel audible, ChatType type, ChatSourceType sourceType, string fromName, UUID id, UUID ownerid, Vector3 position)
{
ChatEventArgs e = new ChatEventArgs(message, audible, type, sourceType, fromName, id, ownerid, position);
if (this.netcomSync != null)
{
this.netcomSync.BeginInvoke(new OnChatRaise(this.OnChatReceived), new object[] { e });
}
else
{
this.OnChatReceived(e);
}
}
private void Self_OnInstantMessage(InstantMessage im, Simulator simulator)
{
InstantMessageEventArgs e = new InstantMessageEventArgs(im, simulator);
if (this.netcomSync != null)
{
this.netcomSync.BeginInvoke(new OnInstantMessageRaise(this.OnInstantMessageReceived), new object[] { e });
}
else
{
this.OnInstantMessageReceived(e);
}
}
private void Self_TeleportProgress(object sender, TeleportEventArgs e)
{
if ((e.Status == TeleportStatus.Finished) || (e.Status == TeleportStatus.Failed))
{
this.teleporting = false;
}
if (this.netcomSync != null)
{
this.netcomSync.BeginInvoke(new OnTeleportStatusRaise(this.OnTeleportStatusChanged), new object[] { e });
}
else
{
this.OnTeleportStatusChanged(e);
}
}
public void SendIMStartTyping(UUID target, UUID session)
{
if (this.loggedIn)
{
this.client.Self.InstantMessage(this.loginDetails.FullName, target, "typing", session, InstantMessageDialog.StartTyping, InstantMessageOnline.Online, this.client.Self.SimPosition, this.client.Network.CurrentSim.ID, null);
}
}
public void SendIMStopTyping(UUID target, UUID session)
{
if (this.loggedIn)
{
this.client.Self.InstantMessage(this.loginDetails.FullName, target, "typing", session, InstantMessageDialog.StopTyping, InstantMessageOnline.Online, this.client.Self.SimPosition, this.client.Network.CurrentSim.ID, null);
}
}
public void SendInstantMessage(string message, UUID target, UUID session)
{
if (this.loggedIn)
{
this.client.Self.InstantMessage(this.loginDetails.FullName, target, message, session, InstantMessageDialog.MessageFromAgent, InstantMessageOnline.Online, this.client.Self.SimPosition, this.client.Network.CurrentSim.ID, null);
this.OnInstantMessageSent(new InstantMessageSentEventArgs(message, target, session, DateTime.Now));
}
}
private string sm_int_to_hex(int inp)
{
switch (inp)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
return inp.ToString();
case 10:
return "A";
case 11:
return "B";
case 12:
return "C";
case 13:
return "D";
case 14:
return "E";
case 15:
return "F";
}
return "0";
}
public void Teleport(string sim, Vector3 coordinates)
{
if (this.loggedIn && !this.teleporting)
{
TeleportingEventArgs e = new TeleportingEventArgs(sim, coordinates);
this.OnTeleporting(e);
if (!e.Cancel)
{
this.teleporting = true;
this.client.Self.Teleport(sim, coordinates);
}
}
}
public SecondLifeBot Client
{
get
{
return this.client;
}
}
public bool IsLoggedIn
{
get
{
return this.loggedIn;
}
}
public bool IsLoggingIn
{
get
{
return this.loggingIn;
}
}
public bool IsTeleporting
{
get
{
return this.teleporting;
}
}
public bot.LoginDetails LoginDetails
{
get
{
return this.loginDetails;
}
set
{
this.loginDetails = value;
}
}
public ISynchronizeInvoke NetcomSync
{
get
{
return this.netcomSync;
}
set
{
this.netcomSync = value;
}
}
private delegate void OnAlertMessageRaise(AlertMessageEventArgs e);
private delegate void OnChatRaise(ChatEventArgs e);
private delegate void OnClientDisconnectRaise(ClientDisconnectEventArgs e);
private delegate void OnClientLoginRaise(ClientLoginEventArgs e);
private delegate void OnClientLogoutRaise(EventArgs e);
private delegate void OnInstantMessageRaise(InstantMessageEventArgs e);
private delegate void OnMoneyBalanceRaise(MoneyBalanceEventArgs e);
private delegate void OnTeleportStatusRaise(TeleportEventArgs e);
}
}