SDK/MrAG/Gamerservices.cs

266 lines
9.8 KiB
C#

using System;
using System.Diagnostics;
using System.Collections.Generic;
namespace MrAG
{
public class Gamerservices
{
public class GamerServicesException : Exception{
public GamerServicesException(string msg): base(msg){
}
}
private struct AvatarRequest{
public string user;
public Action<string, Microsoft.Xna.Framework.Graphics.Texture2D> cb;
}
public static Action<List<MrAG.Serverlist.ServerInfo>> ServerListCallback;
public static Action<byte, Networking.Packet> IncommingTCPPacket;
public static Dictionary<string, Microsoft.Xna.Framework.Graphics.Texture2D> Avatars = new Dictionary<string, Microsoft.Xna.Framework.Graphics.Texture2D>();
private static string User = "";
private static string SessID = "";
private static bool LoggedIn = false;
private static string GameName = "";
private static string APIKey = "";
private static bool DebugMode = false;
private static Microsoft.Xna.Framework.Graphics.GraphicsDevice GraphicsDevice;
private static System.Collections.Generic.List<AvatarRequest> AvatarRequests = new System.Collections.Generic.List<AvatarRequest>();
private static MrAG.Networking.TCPClient APIConnection;
public static MrAG.Networking.TCPClient GetAPIConnection() {
return APIConnection;
}
public static bool GetDebug(){
return DebugMode;
}
public static void SetDebug(bool debug){
DebugMode = debug;
}
public static string GetSessID(){
return SessID;
}
public static string GetAPIKey(){
return APIKey;
}
public static string GetUser(){
return User;
}
public static void SetAPIKey(string key){
APIKey = key;
}
public static string GetIdentifier(){
return GameName;
}
public static void SetIdentifier(string id){
GameName = id;
}
public static void SetUsername(string user) {
User = user;
}
public static bool IsLoggedIn(){
return LoggedIn;
}
public static void SetGraphicsDevice(Microsoft.Xna.Framework.Graphics.GraphicsDevice gs){
GraphicsDevice = gs;
}
public static Microsoft.Xna.Framework.Graphics.Texture2D GetAvatar(string user) {
if (Avatars.ContainsKey(user))
return Avatars[user];
else
return null;
}
public static void RequestAvatar(string user, Action<string, Microsoft.Xna.Framework.Graphics.Texture2D> Callback) {
AvatarRequests.Add(new AvatarRequest(){user = user, cb = Callback});
MrAG.Gamerservices.APIConnection.Send(6, 0, user);
}
public static void Print(string head, string[] keys, string[] values){
string remotetext = head + "\r\n";
System.Diagnostics.Debug.Print(head);
for (int i = 0; i < keys.Length; i++){
System.Diagnostics.Debug.Print("\t" + keys[i] + ": " + values[i]);
remotetext += "\t" + keys[i] + ": " + values[i] + "\r\n";
}
System.Diagnostics.Debug.Print("");
GetAPIConnection().Send(5, remotetext.Length + 4, remotetext.Substring(0, remotetext.Length - 1));
}
public static void Print(string text){
System.Diagnostics.Debug.Print(text);
GetAPIConnection().Send(5, text.Length + 5, text);
}
public static bool Login(bool EnableDrawNoticeSystem){
if (LoggedIn) return false;
string[] args = Environment.GetCommandLineArgs();
if (args.Length > 1) {
string sessID = args[args.Length - 2];
int APIPort = int.Parse(args[args.Length - 1]);
try {
APIConnection = new MrAG.Networking.TCPClient("127.0.0.1", APIPort);
} catch {
throw new GamerServicesException("Failed to connect to the API service!");
}
APIConnection.Send(0, sessID.Length + APIKey.Length + GameName.Length + 13, sessID, APIKey, GameName);
APIConnection.Packets[0] = new Action<MrAG.Networking.Packet>(Packet_00);
APIConnection.Packets[1] = new Action<MrAG.Networking.Packet>(Packet_01);
APIConnection.Packets[2] = new Action<MrAG.Networking.Packet>(Packet_02);
APIConnection.Packets[3] = new Action<MrAG.Networking.Packet>(Packet_03);
APIConnection.Packets[5] = new Action<MrAG.Networking.Packet>(Packet_05);
APIConnection.Packets[6] = new Action<MrAG.Networking.Packet>(Packet_06);
APIConnection.Packets[7] = new Action<MrAG.Networking.Packet>(Packet_07);
while (User.Length == 0) {
APIConnection.Update();
}
LoggedIn = true;
Achievements.Load();
Overlay.InitilizeSystem(EnableDrawNoticeSystem);
} else {
return false;
}
return true;
}
public static void Update() {
if (APIConnection != null) {
APIConnection.OnRecieve = IncommingTCPPacket;
APIConnection.Update();
}
}
public static void LogOut(){
if (User != null && User.Length > 0)
GetAPIConnection().Send(4, 1);
User = "";
SessID = "";
LoggedIn = false;
Overlay.Close();
}
private static void Packet_00(MrAG.Networking.Packet p){
User = p.ReadString();
}
private static void Packet_01(MrAG.Networking.Packet p){
p.Send(1, 1);
}
private static void Packet_02(MrAG.Networking.Packet p){
byte type = p.ReadByte();
switch (type) {
case 0:
short loops = p.ReadShort();
for (short i = 0; i < loops; i++) {
string name = p.ReadString();
Achievements.AchievementList[name] = new Achievements.Achievement();
Achievements.AchievementList[name].Name = name;
Achievements.AchievementList[name].Hash = p.ReadString();
Achievements.AchievementList[name].Desc = p.ReadString();
Achievements.AchievementList[name].CurrentValue = p.ReadInt();
Achievements.AchievementList[name].TargetValue = p.ReadInt();
Achievements.AchievementList[name].Points = p.ReadByte();
Achievements.AchievementList[name].Completed = Achievements.AchievementList[name].CurrentValue >= Achievements.AchievementList[name].TargetValue;
Achievements.AchievementList[name].ID = i;
}
break;
}
}
private static void Packet_03(MrAG.Networking.Packet p){
MrAG.Leaderboard.SubmittedEntry.Rank = p.ReadInt();
MrAG.Gamerservices.GetAPIConnection().Send(5, 0, "Recieved leaderboard pos " + MrAG.Leaderboard.SubmittedEntry.Rank);
}
private static void Packet_05(MrAG.Networking.Packet p){
string title = p.ReadString();
string msg = p.ReadString();
byte icon = p.ReadByte();
Overlay.AddNotice(icon, title, msg);
}
private static void Packet_06(MrAG.Networking.Packet p){
string user = p.ReadString();
string url = p.ReadString();
if (GraphicsDevice == null)
return;
System.Net.WebClient wc = new System.Net.WebClient();
wc.Proxy = null;
System.IO.MemoryStream ms = new System.IO.MemoryStream(wc.DownloadData(url));
System.Drawing.Image img = System.Drawing.Image.FromStream(ms);
System.IO.MemoryStream ms2 = new System.IO.MemoryStream();
img.Save(ms2, System.Drawing.Imaging.ImageFormat.Png);
Microsoft.Xna.Framework.Graphics.Texture2D tex = Microsoft.Xna.Framework.Graphics.Texture2D.FromStream(GraphicsDevice, ms2);
ms.Close();
Avatars[user] = tex;
for (int i = 0; i < AvatarRequests.Count; i++) {
if (AvatarRequests[i].user == user) {
AvatarRequests[i].cb.DynamicInvoke(user, tex);
AvatarRequests.RemoveAt(i);
break;
}
}
}
private static void Packet_07(MrAG.Networking.Packet p){
int count = p.ReadInt();
List<MrAG.Serverlist.ServerInfo> servers = new List<Serverlist.ServerInfo>();
for (int i = 0; i < count; i++)
servers.Add(new MrAG.Serverlist.ServerInfo(){IP = p.ReadString(),
Port = p.ReadInt(),
Servername = p.ReadString(),
Meta = p.ReadString(),
Users = p.ReadInt(),
MaxUsers = p.ReadInt()});
ServerListCallback.DynamicInvoke(servers);
}
}
}