2006-12-22 15:28:33 +00:00
|
|
|
/*
|
|
|
|
|
* ChatConsole.cs: sample SLProxy appliation that writes chat to the console.
|
|
|
|
|
* Typing on the console will send chat to Second Life.
|
|
|
|
|
*
|
|
|
|
|
* Copyright (c) 2006 Austin Jennings
|
|
|
|
|
* Modified by Andrew Ortman ("qode") on Decemeber 21, 2006 to work with the new pregen proxy.
|
|
|
|
|
* All rights reserved.
|
|
|
|
|
*
|
|
|
|
|
* - Redistribution and use in source and binary forms, with or without
|
|
|
|
|
* modification, are permitted provided that the following conditions are met:
|
|
|
|
|
*
|
|
|
|
|
* - Redistributions of source code must retain the above copyright notice, this
|
|
|
|
|
* list of conditions and the following disclaimer.
|
|
|
|
|
* - Neither the name of the Second Life Reverse Engineering Team nor the names
|
|
|
|
|
* of its contributors may be used to endorse or promote products derived from
|
|
|
|
|
* this software without specific prior written permission.
|
|
|
|
|
*
|
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
|
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
|
|
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
|
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
|
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
|
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
|
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
|
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
|
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
using SLProxy;
|
2006-12-21 21:34:01 +00:00
|
|
|
using libsecondlife;
|
2006-12-22 15:28:33 +00:00
|
|
|
using libsecondlife.Packets;
|
|
|
|
|
using Nwc.XmlRpc;
|
|
|
|
|
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections;
|
|
|
|
|
using System.Net;
|
|
|
|
|
using System.Threading;
|
|
|
|
|
|
|
|
|
|
public class ChatConsole {
|
|
|
|
|
private static Proxy proxy;
|
|
|
|
|
private static LLUUID agentID;
|
|
|
|
|
private static LLUUID sessionID;
|
|
|
|
|
|
|
|
|
|
public static void Main(string[] args) {
|
|
|
|
|
// configure the proxy
|
|
|
|
|
ProxyConfig proxyConfig = new ProxyConfig("ChatConsole V2", "Austin Jennings / Andrew Ortman", args);
|
|
|
|
|
proxy = new Proxy(proxyConfig);
|
|
|
|
|
|
|
|
|
|
// set a delegate for when the client logs in
|
|
|
|
|
proxy.SetLoginResponseDelegate(new XmlRpcResponseDelegate(Login));
|
|
|
|
|
|
|
|
|
|
// add a delegate for incoming chat
|
|
|
|
|
proxy.AddDelegate(PacketType.ChatFromSimulator, Direction.Incoming, new PacketDelegate(ChatFromSimulator));
|
|
|
|
|
|
|
|
|
|
// start the proxy
|
|
|
|
|
proxy.Start();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static void Login(XmlRpcResponse response) {
|
|
|
|
|
Hashtable values = (Hashtable)response.Value;
|
|
|
|
|
if (values.Contains("agent_id") && values.Contains("session_id")) {
|
|
|
|
|
// remember our agentID and sessionID
|
|
|
|
|
agentID = new LLUUID((string)values["agent_id"]);
|
|
|
|
|
sessionID = new LLUUID((string)values["session_id"]);
|
|
|
|
|
|
|
|
|
|
// start a new thread that reads lines from the console
|
|
|
|
|
(new Thread(new ThreadStart(ReadFromConsole))).Start();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static void ReadFromConsole() {
|
|
|
|
|
// send text from the console in an infinite loop
|
|
|
|
|
for (;;) {
|
|
|
|
|
// read a line from the console
|
|
|
|
|
string message = Console.ReadLine();
|
|
|
|
|
|
2006-12-21 21:34:01 +00:00
|
|
|
// construct a ChatFromViewer packet
|
|
|
|
|
ChatFromViewerPacket chat = new ChatFromViewerPacket();
|
|
|
|
|
chat.ChatData.Channel = 0;
|
|
|
|
|
chat.ChatData.Message = Helpers.StringToField(message);
|
|
|
|
|
chat.ChatData.Type = (byte)1;
|
|
|
|
|
|
|
|
|
|
chat.AgentData.AgentID = agentID;
|
2006-12-22 15:28:33 +00:00
|
|
|
chat.AgentData.SessionID = sessionID;
|
|
|
|
|
// inject the packet
|
|
|
|
|
proxy.InjectPacket((Packet)chat, Direction.Outgoing);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static Packet ChatFromSimulator(Packet packet, IPEndPoint sim) {
|
2006-12-21 21:34:01 +00:00
|
|
|
// deconstruct the packet
|
|
|
|
|
ChatFromSimulatorPacket chat = (ChatFromSimulatorPacket)packet;
|
|
|
|
|
string message = Helpers.FieldToString(chat.ChatData.Message);
|
|
|
|
|
string name = Helpers.FieldToString(chat.ChatData.FromName);
|
|
|
|
|
byte audible = chat.ChatData.Audible;
|
2006-12-22 15:28:33 +00:00
|
|
|
byte type = chat.ChatData.ChatType;
|
|
|
|
|
|
|
|
|
|
// if this was a normal, audible message, write it to the console
|
|
|
|
|
if (audible != 0 && (type == 0 || type == 1 || type == 2))
|
|
|
|
|
Console.WriteLine(name + ": " + message);
|
|
|
|
|
|
|
|
|
|
// return the packet unmodified
|
|
|
|
|
return packet;
|
|
|
|
|
}
|
|
|
|
|
}
|