Compare commits
No commits in common. "master" and "5.0" have entirely different histories.
@ -11,6 +11,5 @@
|
||||
public DateTime CreatedAt { get; set; } = new DateTime();
|
||||
public int Status { get; set; } = 0;
|
||||
public int CurrencyAmount { get; set; } = 0;
|
||||
public int ProfileCosmeticId { get; set; } = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,14 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace QtCNETAPI.Dtos.User
|
||||
{
|
||||
public class UserPasswordResetDto
|
||||
{
|
||||
public string Token { get; set; } = string.Empty;
|
||||
public string Password { get; set; } = string.Empty;
|
||||
}
|
||||
}
|
||||
@ -6,6 +6,5 @@
|
||||
public string Username { get; set; } = string.Empty;
|
||||
public string Bio { get; set; } = string.Empty;
|
||||
public DateTime DateOfBirth { get; set; } = new DateTime();
|
||||
public int ProfileCosmeticId { get; set; } = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,13 +0,0 @@
|
||||
namespace QtCNETAPI.Enums
|
||||
{
|
||||
public enum GameStatus
|
||||
{
|
||||
WaitingForPlayer,
|
||||
SelectingSymbol,
|
||||
Ongoing,
|
||||
P1Win,
|
||||
P2Win,
|
||||
NoWin,
|
||||
PlayerDisconnected
|
||||
}
|
||||
}
|
||||
@ -1,8 +0,0 @@
|
||||
namespace QtCNETAPI.Enums
|
||||
{
|
||||
public enum StoreItemType
|
||||
{
|
||||
ProfileCosmetic = 1,
|
||||
ClientCosmetic = 2
|
||||
}
|
||||
}
|
||||
@ -1,9 +0,0 @@
|
||||
namespace QtCNETAPI.Enums
|
||||
{
|
||||
public enum TicTacToeSymbol
|
||||
{
|
||||
X,
|
||||
O,
|
||||
Blank
|
||||
}
|
||||
}
|
||||
@ -1,13 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace QtCNETAPI.Events
|
||||
{
|
||||
public class GuestUserJoinEventArgs : EventArgs
|
||||
{
|
||||
public required string Username { get; set; }
|
||||
}
|
||||
}
|
||||
@ -1,14 +0,0 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace QtCNETAPI.Models
|
||||
{
|
||||
public class OwnedStoreItem
|
||||
{
|
||||
[Key]
|
||||
public int Id { get; set; }
|
||||
public string UserId { get; set; } = string.Empty;
|
||||
public int StoreItemId { get; set; }
|
||||
|
||||
public virtual User? User { get; }
|
||||
}
|
||||
}
|
||||
@ -6,6 +6,5 @@
|
||||
public string Name { get; set; } = string.Empty;
|
||||
public string CreatorId { get; set; } = string.Empty;
|
||||
public DateTime CreatedAt { get; set; } = new DateTime();
|
||||
public int UserCount { get; set; } = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -9,19 +9,15 @@
|
||||
public string Role { get; set; } = string.Empty;
|
||||
public string PasswordHash { get; set; } = string.Empty;
|
||||
public string Email { get; set; } = string.Empty;
|
||||
public bool IsEmailVerified { get; set; } = false;
|
||||
public DateTime DateOfBirth { get; set; }
|
||||
public DateTime CreatedAt { get; set; }
|
||||
public int Status { get; set; } = 0;
|
||||
public int CurrencyAmount { get; set; } = 0;
|
||||
public int StockAmount { get; set; } = 0;
|
||||
public DateTime LastCurrencySpin { get; set; }
|
||||
public int ActiveProfileCosmetic { get; set; } = 0;
|
||||
public string CurrentRoomId { get; set; } = string.Empty;
|
||||
|
||||
public virtual IEnumerable<RefreshToken>? RefreshTokens { get; }
|
||||
public virtual IEnumerable<Contact>? ContactsMade { get; }
|
||||
public virtual IEnumerable<Contact>? ContactsList { get; }
|
||||
public virtual IEnumerable<OwnedStoreItem>? OwnedStoreItems { get; }
|
||||
}
|
||||
}
|
||||
|
||||
@ -7,11 +7,10 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Meziantou.Framework.Win32.CredentialManager" Version="1.7.6" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.16" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="9.0.9" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="9.0.5" />
|
||||
<PackageReference Include="RestSharp" Version="112.1.0" />
|
||||
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="8.14.0" />
|
||||
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="8.10.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@ -1,16 +0,0 @@
|
||||
using QtCNETAPI.Enums;
|
||||
using QtCNETAPI.Models;
|
||||
|
||||
namespace QtCNETAPI.Schema
|
||||
{
|
||||
public class GameRoom
|
||||
{
|
||||
public string Id { get; set; } = string.Empty;
|
||||
public GameStatus Status { get; set; }
|
||||
public TicTacToeBoard Board { get; set; } = new();
|
||||
public User? Player1 { get; set; }
|
||||
public TicTacToeSymbol P1Symbol { get; set; } = TicTacToeSymbol.Blank;
|
||||
public User? Player2 { get; set; }
|
||||
public TicTacToeSymbol P2Symbol { get; set; } = TicTacToeSymbol.Blank;
|
||||
}
|
||||
}
|
||||
@ -1,23 +0,0 @@
|
||||
using QtCNETAPI.Enums;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace QtCNETAPI.Schema
|
||||
{
|
||||
public class StoreItem
|
||||
{
|
||||
[JsonPropertyName("Id")]
|
||||
public int Id { get; set; }
|
||||
[JsonPropertyName("Type")]
|
||||
public StoreItemType Type { get; set; }
|
||||
[JsonPropertyName("Price")]
|
||||
public int Price { get; set; }
|
||||
[JsonPropertyName("Name")]
|
||||
public string Name { get; set; } = string.Empty;
|
||||
[JsonPropertyName("Description")]
|
||||
public string Description { get; set; } = string.Empty;
|
||||
[JsonPropertyName("AssetUrl")]
|
||||
public string AssetUrl { get; set; } = string.Empty;
|
||||
[JsonPropertyName("ThumbnailUrl")]
|
||||
public string ThumbnailUrl { get; set; } = string.Empty;
|
||||
}
|
||||
}
|
||||
@ -1,17 +0,0 @@
|
||||
using QtCNETAPI.Enums;
|
||||
|
||||
namespace QtCNETAPI.Schema
|
||||
{
|
||||
public class TicTacToeBoard
|
||||
{
|
||||
public TicTacToeSymbol Square1 { get; set; } = TicTacToeSymbol.Blank;
|
||||
public TicTacToeSymbol Square2 { get; set; } = TicTacToeSymbol.Blank;
|
||||
public TicTacToeSymbol Square3 { get; set; } = TicTacToeSymbol.Blank;
|
||||
public TicTacToeSymbol Square4 { get; set; } = TicTacToeSymbol.Blank;
|
||||
public TicTacToeSymbol Square5 { get; set; } = TicTacToeSymbol.Blank;
|
||||
public TicTacToeSymbol Square6 { get; set; } = TicTacToeSymbol.Blank;
|
||||
public TicTacToeSymbol Square7 { get; set; } = TicTacToeSymbol.Blank;
|
||||
public TicTacToeSymbol Square8 { get; set; } = TicTacToeSymbol.Blank;
|
||||
public TicTacToeSymbol Square9 { get; set; } = TicTacToeSymbol.Blank;
|
||||
}
|
||||
}
|
||||
@ -1,10 +0,0 @@
|
||||
using QtCNETAPI.Models;
|
||||
|
||||
namespace QtCNETAPI.Schema
|
||||
{
|
||||
public class TicTacToeMove
|
||||
{
|
||||
public User User { get; set; } = new();
|
||||
public int Point { get; set; }
|
||||
}
|
||||
}
|
||||
@ -2,9 +2,9 @@
|
||||
using QtCNETAPI.Dtos.User;
|
||||
using QtCNETAPI.Enums;
|
||||
using QtCNETAPI.Models;
|
||||
using QtCNETAPI.Schema;
|
||||
using RestSharp;
|
||||
using System.IdentityModel.Tokens.Jwt;
|
||||
using System.Resources;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace QtCNETAPI.Services.ApiService
|
||||
@ -13,15 +13,10 @@ namespace QtCNETAPI.Services.ApiService
|
||||
{
|
||||
private User? user;
|
||||
private RestClient _client;
|
||||
private LoggingService _loggingService;
|
||||
|
||||
private CredentialService _credService = new();
|
||||
|
||||
internal string? sessionToken;
|
||||
internal string apiUri;
|
||||
|
||||
public event EventHandler? OnCurrentUserUpdate;
|
||||
|
||||
public string? SessionToken
|
||||
{
|
||||
get { return sessionToken; }
|
||||
@ -33,10 +28,9 @@ namespace QtCNETAPI.Services.ApiService
|
||||
get { return user; }
|
||||
}
|
||||
|
||||
public ApiService(string apiUrl, LoggingService loggingService)
|
||||
public ApiService(string apiUrl)
|
||||
{
|
||||
apiUri = apiUrl;
|
||||
_loggingService = loggingService;
|
||||
_client = new RestClient(apiUri);
|
||||
}
|
||||
|
||||
@ -157,9 +151,10 @@ namespace QtCNETAPI.Services.ApiService
|
||||
serviceResponse.Success = true;
|
||||
serviceResponse.Data = response.Data;
|
||||
|
||||
// anything that changes the user should tell the api service to set it again
|
||||
await SetCurrentUser();
|
||||
OnCurrentUserUpdate?.Invoke(this, EventArgs.Empty);
|
||||
// update currentuser model
|
||||
CurrentUser!.Username = response.Data!.Username;
|
||||
CurrentUser.Bio = response.Data.Bio;
|
||||
CurrentUser.DateOfBirth = response.Data.DateOfBirth;
|
||||
} else
|
||||
{
|
||||
serviceResponse.Success = false;
|
||||
@ -185,10 +180,6 @@ namespace QtCNETAPI.Services.ApiService
|
||||
{
|
||||
serviceResponse.Success = true;
|
||||
serviceResponse.Data = response.Data;
|
||||
|
||||
// anything that changes the user should tell the api service to set it again
|
||||
await SetCurrentUser();
|
||||
OnCurrentUserUpdate?.Invoke(this, EventArgs.Empty);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -237,9 +228,9 @@ namespace QtCNETAPI.Services.ApiService
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<ServiceResponse<string>> LoginAsync(UserLoginDto userLoginDto)
|
||||
public async Task<ServiceResponse<User>> LoginAsync(UserLoginDto userLoginDto)
|
||||
{
|
||||
var serviceResponse = new ServiceResponse<string>();
|
||||
var serviceResponse = new ServiceResponse<User>();
|
||||
|
||||
try
|
||||
{
|
||||
@ -259,11 +250,13 @@ namespace QtCNETAPI.Services.ApiService
|
||||
{
|
||||
SessionToken = response.Data!;
|
||||
|
||||
await File.WriteAllTextAsync("./session.token", response.Message);
|
||||
|
||||
var user = await SetCurrentUser();
|
||||
|
||||
serviceResponse.Success = true;
|
||||
if (response.Message != null) serviceResponse.Message = response.Message;
|
||||
serviceResponse.Data = response.Message;
|
||||
serviceResponse.Data = user;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -280,85 +273,16 @@ namespace QtCNETAPI.Services.ApiService
|
||||
return serviceResponse;
|
||||
}
|
||||
|
||||
public async Task<ServiceResponse<bool>> ResendVerificationEmail(string email)
|
||||
{
|
||||
var serviceResponse = new ServiceResponse<bool>();
|
||||
|
||||
var restRequest = new RestRequest($"auth/resend-verification-email")
|
||||
.AddQueryParameter("email", email);
|
||||
var response = await _client.PostAsync<ServiceResponse<bool>>(restRequest);
|
||||
|
||||
if (response != null)
|
||||
{
|
||||
serviceResponse.Success = true;
|
||||
serviceResponse.Data = response.Data;
|
||||
}
|
||||
else
|
||||
{
|
||||
serviceResponse.Success = false;
|
||||
serviceResponse.Message = "API never responded.";
|
||||
}
|
||||
|
||||
return serviceResponse;
|
||||
}
|
||||
|
||||
public async Task<ServiceResponse<bool>> SendPasswordResetEmail(string email)
|
||||
{
|
||||
var serviceResponse = new ServiceResponse<bool>();
|
||||
|
||||
var restRequest = new RestRequest($"auth/request-password-reset")
|
||||
.AddQueryParameter("email", email);
|
||||
var response = await _client.PostAsync<ServiceResponse<bool>>(restRequest);
|
||||
|
||||
if (response != null)
|
||||
{
|
||||
serviceResponse.Success = true;
|
||||
serviceResponse.Data = response.Data;
|
||||
}
|
||||
else
|
||||
{
|
||||
serviceResponse.Success = false;
|
||||
serviceResponse.Message = "API never responded.";
|
||||
}
|
||||
|
||||
return serviceResponse;
|
||||
}
|
||||
|
||||
public async Task<ServiceResponse<bool>> ResetPassword(UserPasswordResetDto request)
|
||||
{
|
||||
var serviceResponse = new ServiceResponse<bool>();
|
||||
|
||||
var restRequest = new RestRequest($"auth/reset-password")
|
||||
.AddJsonBody(request);
|
||||
var response = await _client.PostAsync<ServiceResponse<bool>>(restRequest);
|
||||
|
||||
if (response != null)
|
||||
{
|
||||
serviceResponse.Success = true;
|
||||
serviceResponse.Data = response.Data;
|
||||
}
|
||||
else
|
||||
{
|
||||
serviceResponse.Success = false;
|
||||
serviceResponse.Message = "API never responded.";
|
||||
}
|
||||
|
||||
return serviceResponse;
|
||||
}
|
||||
|
||||
public async Task<User> SetCurrentUser()
|
||||
private async Task<User> SetCurrentUser()
|
||||
{
|
||||
var userRequest = new RestRequest("users/user-authorized")
|
||||
.AddHeader("Authorization", $"Bearer {SessionToken}");
|
||||
var userResponse = await _client.GetAsync<ServiceResponse<User>>(userRequest);
|
||||
|
||||
if (userResponse != null && userResponse.Success && userResponse.Data != null)
|
||||
if (userResponse != null || userResponse!.Data != null)
|
||||
{
|
||||
user = userResponse.Data;
|
||||
|
||||
_loggingService.LogString($"Current User's Status Is {userResponse.Data.Status}");
|
||||
|
||||
return userResponse.Data;
|
||||
return userResponse.Data!;
|
||||
} else
|
||||
{
|
||||
throw new NullReferenceException("Current User could not be set.");
|
||||
@ -413,23 +337,21 @@ namespace QtCNETAPI.Services.ApiService
|
||||
public async Task<ServiceResponse<string>> RefreshSessionIfInvalid()
|
||||
{
|
||||
var tokenHandler = new JwtSecurityTokenHandler();
|
||||
var refToken = _credService.GetAccessToken(); // fuck CA1416, if this is being ran on linux it should just crash (theoretically)
|
||||
|
||||
if (refToken == null)
|
||||
{
|
||||
// treat as session expired
|
||||
return new ServiceResponse<string> { Success = false, Message = "Refresh Token Not Found. Session Expired." };
|
||||
}
|
||||
var refToken = await File.ReadAllTextAsync("./session.token");
|
||||
|
||||
JwtSecurityToken token = tokenHandler.ReadJwtToken(SessionToken);
|
||||
|
||||
if(DateTime.Compare(DateTime.UtcNow, token.ValidTo) > 0)
|
||||
{
|
||||
if (!File.Exists("./session.token")) { return new ServiceResponse<string> { Success = false, Message = "Session File Not Found. Session Expired." }; }
|
||||
|
||||
var result = await RefreshLogin(refToken);
|
||||
|
||||
if (result == null || result.Success == false)
|
||||
{
|
||||
return new ServiceResponse<string> { Success = false, Message = "Session Expired." }; // logging in again should overwrite old token
|
||||
File.Delete("./session.token");
|
||||
|
||||
return new ServiceResponse<string> { Success = false, Message = "Session Expired." };
|
||||
} else return new ServiceResponse<string> { Success = true, Data = refToken };
|
||||
} else return new ServiceResponse<string> { Success = true, Data = refToken };
|
||||
}
|
||||
@ -668,10 +590,6 @@ namespace QtCNETAPI.Services.ApiService
|
||||
{
|
||||
serviceResponse.Success = true;
|
||||
serviceResponse.Data = response.Data;
|
||||
|
||||
// anything that changes the user should tell the api service to set it again
|
||||
await SetCurrentUser();
|
||||
OnCurrentUserUpdate?.Invoke(this, EventArgs.Empty);
|
||||
}
|
||||
|
||||
return serviceResponse;
|
||||
@ -719,10 +637,6 @@ namespace QtCNETAPI.Services.ApiService
|
||||
{
|
||||
serviceResponse.Success = true;
|
||||
serviceResponse.Data = response.Data;
|
||||
|
||||
// anything that changes the user should tell the api service to set it again
|
||||
await SetCurrentUser();
|
||||
OnCurrentUserUpdate?.Invoke(this, EventArgs.Empty);
|
||||
}
|
||||
|
||||
return serviceResponse;
|
||||
@ -747,10 +661,6 @@ namespace QtCNETAPI.Services.ApiService
|
||||
{
|
||||
serviceResponse.Success = true;
|
||||
serviceResponse.Data = response.Data;
|
||||
|
||||
// anything that changes the user should tell the api service to set it again
|
||||
await SetCurrentUser();
|
||||
OnCurrentUserUpdate?.Invoke(this, EventArgs.Empty);
|
||||
}
|
||||
|
||||
return serviceResponse;
|
||||
@ -803,151 +713,5 @@ namespace QtCNETAPI.Services.ApiService
|
||||
|
||||
return serviceResponse;
|
||||
}
|
||||
|
||||
public async Task<ServiceResponse<List<StoreItem>>> GetStoreItems()
|
||||
{
|
||||
await RefreshSessionIfInvalid();
|
||||
|
||||
var serviceResponse = new ServiceResponse<List<StoreItem>>();
|
||||
|
||||
if (SessionToken == null) throw new NullReferenceException("Function Was Called Before A Session Was Made.");
|
||||
|
||||
var restRequest = new RestRequest("store/all-items")
|
||||
.AddHeader("Authorization", $"Bearer {SessionToken}");
|
||||
var response = await _client.GetAsync<ServiceResponse<List<StoreItem>>>(restRequest);
|
||||
|
||||
if (response == null) { serviceResponse.Success = false; serviceResponse.Message = "API did not respond."; return serviceResponse; }
|
||||
|
||||
if (response.Success)
|
||||
{
|
||||
serviceResponse.Success = true;
|
||||
serviceResponse.Data = response.Data;
|
||||
}
|
||||
|
||||
return serviceResponse;
|
||||
}
|
||||
|
||||
public async Task<ServiceResponse<StoreItem>> GetStoreItem(int id)
|
||||
{
|
||||
await RefreshSessionIfInvalid();
|
||||
|
||||
var serviceResponse = new ServiceResponse<StoreItem>();
|
||||
|
||||
if (SessionToken == null) throw new NullReferenceException("Function Was Called Before A Session Was Made.");
|
||||
|
||||
var restRequest = new RestRequest("store/item")
|
||||
.AddHeader("Authorization", $"Bearer {SessionToken}")
|
||||
.AddQueryParameter("id", id);
|
||||
var response = await _client.GetAsync<ServiceResponse<StoreItem>>(restRequest);
|
||||
|
||||
if (response == null) { serviceResponse.Success = false; serviceResponse.Message = "API did not respond."; return serviceResponse; }
|
||||
|
||||
if (response.Success)
|
||||
{
|
||||
serviceResponse.Success = true;
|
||||
serviceResponse.Data = response.Data;
|
||||
}
|
||||
|
||||
return serviceResponse;
|
||||
}
|
||||
|
||||
public async Task<ServiceResponse<bool>> BuyStoreItem(int id)
|
||||
{
|
||||
await RefreshSessionIfInvalid();
|
||||
|
||||
var serviceResponse = new ServiceResponse<bool>();
|
||||
|
||||
if (SessionToken == null) throw new NullReferenceException("Function Was Called Before A Session Was Made.");
|
||||
|
||||
var restRequest = new RestRequest("store/buy-item")
|
||||
.AddHeader("Authorization", $"Bearer {SessionToken}")
|
||||
.AddQueryParameter("id", id);
|
||||
var response = await _client.PostAsync<ServiceResponse<bool>>(restRequest);
|
||||
|
||||
if (response == null) { serviceResponse.Success = false; serviceResponse.Message = "API did not respond."; return serviceResponse; }
|
||||
|
||||
if (response.Success)
|
||||
{
|
||||
serviceResponse.Success = true;
|
||||
serviceResponse.Data = response.Data;
|
||||
|
||||
// anything that changes the user should tell the api service to set it again
|
||||
await SetCurrentUser();
|
||||
OnCurrentUserUpdate?.Invoke(this, EventArgs.Empty);
|
||||
}
|
||||
|
||||
return serviceResponse;
|
||||
}
|
||||
|
||||
public async Task<ServiceResponse<List<OwnedStoreItem>>> GetOwnedStoreItems()
|
||||
{
|
||||
await RefreshSessionIfInvalid();
|
||||
|
||||
var serviceResponse = new ServiceResponse<List<OwnedStoreItem>>();
|
||||
|
||||
if (SessionToken == null) throw new NullReferenceException("Function Was Called Before A Session Was Made.");
|
||||
|
||||
var restRequest = new RestRequest("store/bought-items")
|
||||
.AddHeader("Authorization", $"Bearer {SessionToken}");
|
||||
var response = await _client.GetAsync<ServiceResponse<List<OwnedStoreItem>>>(restRequest);
|
||||
|
||||
if (response == null) { serviceResponse.Success = false; serviceResponse.Message = "API did not respond."; return serviceResponse; }
|
||||
|
||||
if (response.Success)
|
||||
{
|
||||
serviceResponse.Success = true;
|
||||
serviceResponse.Data = response.Data;
|
||||
}
|
||||
|
||||
return serviceResponse;
|
||||
}
|
||||
|
||||
public async Task<ServiceResponse<OwnedStoreItem>> GetOwnedStoreItem(int id)
|
||||
{
|
||||
await RefreshSessionIfInvalid();
|
||||
|
||||
var serviceResponse = new ServiceResponse<OwnedStoreItem>();
|
||||
|
||||
if (SessionToken == null) throw new NullReferenceException("Function Was Called Before A Session Was Made.");
|
||||
|
||||
var restRequest = new RestRequest("store/bought-item")
|
||||
.AddHeader("Authorization", $"Bearer {SessionToken}")
|
||||
.AddQueryParameter("id", id);
|
||||
var response = await _client.GetAsync<ServiceResponse<OwnedStoreItem>>(restRequest);
|
||||
|
||||
if (response == null) { serviceResponse.Success = false; serviceResponse.Message = "API did not respond."; return serviceResponse; }
|
||||
|
||||
if (response.Success)
|
||||
{
|
||||
serviceResponse.Success = true;
|
||||
serviceResponse.Data = response.Data;
|
||||
}
|
||||
|
||||
return serviceResponse;
|
||||
}
|
||||
|
||||
public async Task<ServiceResponse<User>> DeleteUserById(string id)
|
||||
{
|
||||
await RefreshSessionIfInvalid();
|
||||
|
||||
var serviceResponse = new ServiceResponse<User>();
|
||||
|
||||
if (SessionToken == null) throw new NullReferenceException("Function Was Called Before A Session Was Made.");
|
||||
|
||||
var restRequest = new RestRequest("users/delete-user")
|
||||
.AddHeader("Authorization", $"Bearer {SessionToken}")
|
||||
.AddQueryParameter("id", id);
|
||||
var response = await _client.DeleteAsync<ServiceResponse<User>>(restRequest);
|
||||
|
||||
if (response == null) { serviceResponse.Success = false; serviceResponse.Message = "API did not respond."; return serviceResponse; }
|
||||
|
||||
if (response.Success)
|
||||
{
|
||||
serviceResponse.Success = true;
|
||||
serviceResponse.Data = response.Data;
|
||||
}
|
||||
|
||||
return serviceResponse;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -8,7 +8,6 @@ using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using QtCNETAPI.Enums;
|
||||
using QtCNETAPI.Schema;
|
||||
|
||||
namespace QtCNETAPI.Services.ApiService
|
||||
{
|
||||
@ -17,19 +16,12 @@ namespace QtCNETAPI.Services.ApiService
|
||||
public string? SessionToken { get; set; }
|
||||
public User CurrentUser { get; }
|
||||
|
||||
public event EventHandler? OnCurrentUserUpdate;
|
||||
|
||||
public Task<ServiceResponse<string>> PingServerAsync();
|
||||
public Task<ServiceResponse<List<UserInformationDto>>> GetOnlineUsersAsync();
|
||||
public Task<ServiceResponse<List<UserInformationDto>>> GetAllUsersAsync();
|
||||
public Task<ServiceResponse<User>> DeleteUserById(string id);
|
||||
public Task<ServiceResponse<string>> LoginAsync(UserLoginDto userLoginDto);
|
||||
public Task<ServiceResponse<bool>> ResendVerificationEmail(string email);
|
||||
public Task<ServiceResponse<bool>> SendPasswordResetEmail(string email);
|
||||
public Task<ServiceResponse<bool>> ResetPassword(UserPasswordResetDto request);
|
||||
public Task<ServiceResponse<User>> LoginAsync(UserLoginDto userLoginDto);
|
||||
public Task<ServiceResponse<User>> RefreshLogin(string refreshToken);
|
||||
public Task<ServiceResponse<string>> RefreshSessionIfInvalid();
|
||||
public Task<User> SetCurrentUser();
|
||||
public Task<ServiceResponse<User>> RegisterAsync(UserDto userDto);
|
||||
public Task<ServiceResponse<UserInformationDto>> GetUserInformationAsync(string id);
|
||||
public Task<ServiceResponse<UserInformationDto>> UpdateUserInformationAsync(UserUpdateInformationDto request);
|
||||
@ -48,10 +40,5 @@ namespace QtCNETAPI.Services.ApiService
|
||||
public Task<ServiceResponse<UserStockActionResultDto>> SellStock(int amount);
|
||||
public Task<ServiceResponse<int>> GetRandomNumber();
|
||||
public Task<ServiceResponse<NumberGuessResult>> GuessRandomNumber(int original, int guess);
|
||||
public Task<ServiceResponse<List<StoreItem>>> GetStoreItems();
|
||||
public Task<ServiceResponse<StoreItem>> GetStoreItem(int id);
|
||||
public Task<ServiceResponse<bool>> BuyStoreItem(int id);
|
||||
public Task<ServiceResponse<List<OwnedStoreItem>>> GetOwnedStoreItems();
|
||||
public Task<ServiceResponse<OwnedStoreItem>> GetOwnedStoreItem(int id);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,42 +0,0 @@
|
||||
using Meziantou.Framework.Win32;
|
||||
|
||||
namespace QtCNETAPI.Services
|
||||
{
|
||||
public class CredentialService()
|
||||
{
|
||||
/*
|
||||
|
||||
* NOTE *
|
||||
This does not work on other platforms such as Linux or macOS.
|
||||
I will probably recode the legacy way of doing this for those other platforms.
|
||||
|
||||
*/
|
||||
|
||||
public void SaveAccessToken(string username, string accessToken)
|
||||
{
|
||||
string applicationName = "QtC.NET";
|
||||
if (System.Diagnostics.Debugger.IsAttached) applicationName = "QtC.NET.Development";
|
||||
|
||||
CredentialManager.WriteCredential(applicationName, username, accessToken, $"Access Token For User {username} On QtC.NET", CredentialPersistence.LocalMachine);
|
||||
}
|
||||
|
||||
public void DeleteAccessToken()
|
||||
{
|
||||
string applicationName = "QtC.NET";
|
||||
if (System.Diagnostics.Debugger.IsAttached) applicationName = "QtC.NET.Development";
|
||||
|
||||
CredentialManager.DeleteCredential(applicationName);
|
||||
}
|
||||
|
||||
public string? GetAccessToken()
|
||||
{
|
||||
string applicationName = "QtC.NET";
|
||||
if (System.Diagnostics.Debugger.IsAttached) applicationName = "QtC.NET.Development";
|
||||
|
||||
var credential = CredentialManager.ReadCredential(applicationName);
|
||||
if (credential == null) return null;
|
||||
|
||||
return credential.Password;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,5 +1,4 @@
|
||||
using Microsoft.AspNetCore.SignalR.Client;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using QtCNETAPI.Dtos.User;
|
||||
using QtCNETAPI.Events;
|
||||
using QtCNETAPI.Models;
|
||||
@ -7,54 +6,47 @@ using QtCNETAPI.Services.ApiService;
|
||||
|
||||
namespace QtCNETAPI.Services.GatewayService
|
||||
{
|
||||
public class GatewayService(string GWUrl, IApiService apiService, LoggingService loggingService) : IGatewayService, IAsyncDisposable
|
||||
public class GatewayService : IGatewayService, IAsyncDisposable
|
||||
{
|
||||
internal string gwBaseUri = GWUrl;
|
||||
internal string gwBaseUri = "127.0.0.1";
|
||||
|
||||
public Room? CurrentRoom { get; private set; }
|
||||
public bool InLobby { get; private set; }
|
||||
public HubConnection? HubConnection { get; private set; }
|
||||
|
||||
|
||||
public event EventHandler? OnRoomMessageReceived;
|
||||
public event EventHandler? OnRoomUserListReceived;
|
||||
public event EventHandler? OnGuestUserJoin;
|
||||
public event EventHandler? OnRefreshUserListsReceived;
|
||||
public event EventHandler? OnRefreshRoomListReceived;
|
||||
public event EventHandler? OnRoomDeleted;
|
||||
public event EventHandler? OnRefreshContactsListReceived;
|
||||
public event EventHandler? OnClientFunctionReceived;
|
||||
public event EventHandler? OnDirectMessageReceived;
|
||||
public event EventHandler? OnServerConfigReceived;
|
||||
public event EventHandler? OnServerDisconnect;
|
||||
public event EventHandler? OnServerReconnecting;
|
||||
public event EventHandler? OnServerReconnected;
|
||||
public event EventHandler? OnUserForceLogout;
|
||||
public event EventHandler OnRoomMessageReceived;
|
||||
public event EventHandler OnRoomUserListReceived;
|
||||
public event EventHandler OnRefreshUserListsReceived;
|
||||
public event EventHandler OnRefreshRoomListReceived;
|
||||
public event EventHandler OnRefreshContactsListReceived;
|
||||
public event EventHandler OnClientFunctionReceived;
|
||||
public event EventHandler OnDirectMessageReceived;
|
||||
public event EventHandler OnServerConfigReceived;
|
||||
public event EventHandler OnServerDisconnect;
|
||||
public event EventHandler OnServerReconnecting;
|
||||
public event EventHandler OnServerReconnected;
|
||||
|
||||
private IApiService _apiService = apiService;
|
||||
private LoggingService _loggingService = loggingService;
|
||||
private IApiService _apiService;
|
||||
|
||||
public GatewayService(string GWUrl, IApiService apiService)
|
||||
{
|
||||
gwBaseUri = GWUrl;
|
||||
_apiService = apiService;
|
||||
}
|
||||
|
||||
public async Task StartAsync()
|
||||
{
|
||||
// just to be safe (it doesn't load the server since it shouldn't request a new one unless its actually expired)
|
||||
await _apiService.RefreshSessionIfInvalid();
|
||||
|
||||
// build connection
|
||||
var gwConBuilder = new HubConnectionBuilder()
|
||||
.WithAutomaticReconnect()
|
||||
.ConfigureLogging((builder) =>
|
||||
{
|
||||
builder.AddProvider(new LoggingServiceProvider(_loggingService));
|
||||
|
||||
if (System.Diagnostics.Debugger.IsAttached) builder.SetMinimumLevel(LogLevel.Debug);
|
||||
else builder.SetMinimumLevel(LogLevel.Error);
|
||||
})
|
||||
.WithUrl(gwBaseUri, options =>
|
||||
{
|
||||
options.AccessTokenProvider = async () =>
|
||||
{
|
||||
// this should hopefully refresh the session every time the gateway connection is used to prevent connection aborts
|
||||
await _apiService.RefreshSessionIfInvalid();
|
||||
return _apiService.SessionToken;
|
||||
};
|
||||
})
|
||||
.WithStatefulReconnect();
|
||||
options.AccessTokenProvider = () => Task.FromResult(_apiService.SessionToken);
|
||||
});
|
||||
HubConnection = gwConBuilder.Build();
|
||||
|
||||
// register events
|
||||
@ -66,28 +58,14 @@ namespace QtCNETAPI.Services.GatewayService
|
||||
HubConnection.On("RefreshContactsList", () => OnRefreshContactsListReceived?.Invoke(this, EventArgs.Empty));
|
||||
HubConnection.On<ServerConfig>("ReceiveServerConfig", (serverConfig) => OnServerConfigReceived?.Invoke(this, new ServerConfigEventArgs { ServerConfig = serverConfig }));
|
||||
HubConnection.On<List<User>>("RoomUserList", (userList) => OnRoomUserListReceived?.Invoke(this, new RoomListEventArgs { UserList = userList }));
|
||||
HubConnection.On<string>("GuestJoin", (username) => OnGuestUserJoin?.Invoke(this, new GuestUserJoinEventArgs { Username = username }));
|
||||
HubConnection.On("RoomDeleted", () => OnRoomDeleted?.Invoke(this, EventArgs.Empty));
|
||||
HubConnection.On("ForceSignOut", () => OnUserForceLogout?.Invoke(this, EventArgs.Empty));
|
||||
|
||||
HubConnection.Closed += HubConnection_Closed;
|
||||
HubConnection.Reconnecting += HubConnection_Reconnecting;
|
||||
HubConnection.Reconnected += HubConnection_Reconnected;
|
||||
|
||||
// start connection
|
||||
try
|
||||
{
|
||||
await HubConnection.StartAsync();
|
||||
}
|
||||
catch (HttpRequestException ex)
|
||||
{
|
||||
_loggingService.LogString($"Unable To Connect To SignalR.\n{ex.Message}\n{ex.StackTrace}");
|
||||
return;
|
||||
}
|
||||
|
||||
// ensure current user is up to date (particularly status)
|
||||
await _apiService.SetCurrentUser();
|
||||
}
|
||||
|
||||
public async Task StopAsync()
|
||||
{
|
||||
@ -119,35 +97,71 @@ namespace QtCNETAPI.Services.GatewayService
|
||||
}
|
||||
}
|
||||
|
||||
public async Task JoinRoomAsync(Room? room = null)
|
||||
public async Task JoinLobbyAsync()
|
||||
{
|
||||
await _apiService.RefreshSessionIfInvalid();
|
||||
|
||||
if (HubConnection == null || HubConnection.State != HubConnectionState.Connected) throw new InvalidOperationException("Function was called before connection was made.");
|
||||
|
||||
// assume user is trying to join lobby if room is null (does not have db entry)
|
||||
room ??= new Room
|
||||
{
|
||||
Id = "LOBBY",
|
||||
Name = "Lobby"
|
||||
};
|
||||
await HubConnection.SendAsync("JoinLobby", _apiService.CurrentUser);
|
||||
InLobby = true;
|
||||
CurrentRoom = null;
|
||||
}
|
||||
|
||||
public async Task JoinRoomAsync(Room room)
|
||||
{
|
||||
await _apiService.RefreshSessionIfInvalid();
|
||||
|
||||
if (HubConnection == null || HubConnection.State != HubConnectionState.Connected) throw new InvalidOperationException("Function was called before connection was made.");
|
||||
|
||||
if (InLobby == true)
|
||||
{
|
||||
await HubConnection.SendAsync("LeaveLobby", _apiService.CurrentUser);
|
||||
InLobby = false;
|
||||
}
|
||||
else if (CurrentRoom != null)
|
||||
{
|
||||
await HubConnection.SendAsync("LeaveRoom", _apiService.CurrentUser, CurrentRoom);
|
||||
}
|
||||
|
||||
if (CurrentRoom != null) await HubConnection.SendAsync("LeaveRoom", _apiService.CurrentUser, CurrentRoom);
|
||||
await HubConnection.SendAsync("JoinRoom", _apiService.CurrentUser, room);
|
||||
CurrentRoom = room;
|
||||
}
|
||||
|
||||
public async Task LeaveRoomAsync()
|
||||
{
|
||||
await _apiService.RefreshSessionIfInvalid();
|
||||
|
||||
if (HubConnection == null || HubConnection.State != HubConnectionState.Connected) throw new InvalidOperationException("Function was called before connection was made.");
|
||||
|
||||
if (CurrentRoom != null) await HubConnection.SendAsync("LeaveRoom", _apiService.CurrentUser, CurrentRoom);
|
||||
if (InLobby)
|
||||
{
|
||||
await HubConnection.SendAsync("LeaveLobby", _apiService.CurrentUser);
|
||||
InLobby = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
await HubConnection.SendAsync("LeaveRoom", _apiService.CurrentUser, CurrentRoom);
|
||||
CurrentRoom = null;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task RefreshContactsForUser(UserInformationDto user)
|
||||
{
|
||||
await _apiService.RefreshSessionIfInvalid();
|
||||
|
||||
if (HubConnection == null || HubConnection.State != HubConnectionState.Connected) throw new InvalidOperationException("Function was called before connection was made.");
|
||||
|
||||
await HubConnection.SendAsync("RefreshContactsListOnUser", user, _apiService.CurrentUser);
|
||||
}
|
||||
|
||||
public async Task PostMessageAsync(Message message)
|
||||
{
|
||||
await _apiService.RefreshSessionIfInvalid();
|
||||
|
||||
if (HubConnection == null || HubConnection.State != HubConnectionState.Connected) throw new InvalidOperationException("Function was called before connection was made.");
|
||||
|
||||
await HubConnection.SendAsync("SendMessage", _apiService.CurrentUser, message, CurrentRoom);
|
||||
await HubConnection.SendAsync("SendMessage", _apiService.CurrentUser, message, InLobby, CurrentRoom);
|
||||
}
|
||||
|
||||
public async Task SendDirectMessageAsync(UserInformationDto user, Message message)
|
||||
@ -161,12 +175,11 @@ namespace QtCNETAPI.Services.GatewayService
|
||||
|
||||
public async Task UpdateStatus(int status)
|
||||
{
|
||||
await _apiService.RefreshSessionIfInvalid();
|
||||
|
||||
if (HubConnection == null || HubConnection.State != HubConnectionState.Connected) throw new InvalidOperationException("Function was called before connection was made.");
|
||||
|
||||
await HubConnection.SendAsync("UpdateStatus", _apiService.CurrentUser, status);
|
||||
|
||||
// anything that changes the user should tell the api service to set it again
|
||||
await _apiService.SetCurrentUser();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -18,7 +18,10 @@ namespace QtCNETAPI.Services.GatewayService
|
||||
/// The Current Room The Current User Is In
|
||||
/// </summary>
|
||||
public Room? CurrentRoom { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Is The User Currently In The Lobby?
|
||||
/// </summary>
|
||||
public bool InLobby { get; }
|
||||
/// <summary>
|
||||
/// The Current Connection To The Gateway
|
||||
/// </summary>
|
||||
@ -44,13 +47,20 @@ namespace QtCNETAPI.Services.GatewayService
|
||||
/// <returns></returns>
|
||||
public Task DisposeAsync();
|
||||
|
||||
/// <summary>
|
||||
/// Joins The Lobby Of The Server
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="InvalidOperationException">Thrown if the function is called before the connection is established.</exception>
|
||||
public Task JoinLobbyAsync();
|
||||
|
||||
/// <summary>
|
||||
/// Joins The Current User To A Room On The Server
|
||||
/// </summary>
|
||||
/// <param name="room">Room To Join</param>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="InvalidOperationException">Thrown if the function is called before the connection is established.</exception>
|
||||
public Task JoinRoomAsync(Room? room = null);
|
||||
public Task JoinRoomAsync(Room room);
|
||||
|
||||
/// <summary>
|
||||
/// Leaves The Current Room The Current User Is In
|
||||
@ -75,6 +85,14 @@ namespace QtCNETAPI.Services.GatewayService
|
||||
/// <returns></returns>
|
||||
public Task SendDirectMessageAsync(UserInformationDto user, Message message);
|
||||
|
||||
/// <summary>
|
||||
/// Refreshes Contacts List For A Specified User
|
||||
/// </summary>
|
||||
/// <param name="user">The User You Wish To Refresh</param>
|
||||
/// <param name="currentUser">Yourself</param>
|
||||
/// <returns></returns>
|
||||
public Task RefreshContactsForUser(UserInformationDto user);
|
||||
|
||||
/// <summary>
|
||||
/// Updates The Status For The Current User
|
||||
/// </summary>
|
||||
@ -94,16 +112,6 @@ namespace QtCNETAPI.Services.GatewayService
|
||||
/// </summary>
|
||||
public event EventHandler OnRoomUserListReceived;
|
||||
|
||||
/// <summary>
|
||||
/// Fires When The Room The User Is In Gets Deleted By An Admin
|
||||
/// </summary>
|
||||
public event EventHandler OnRoomDeleted;
|
||||
|
||||
/// <summary>
|
||||
/// Fires When A Guest User Joins Your Room
|
||||
/// </summary>
|
||||
public event EventHandler OnGuestUserJoin;
|
||||
|
||||
/// <summary>
|
||||
/// When A Client Function/Event Is Received, This Event Fires
|
||||
/// </summary>
|
||||
@ -148,10 +156,5 @@ namespace QtCNETAPI.Services.GatewayService
|
||||
/// When the Connection Reconnects, This Event Fires
|
||||
/// </summary>
|
||||
public event EventHandler OnServerReconnected;
|
||||
|
||||
/// <summary>
|
||||
/// Fires When The Current User Is Signed Out By The Server
|
||||
/// </summary>
|
||||
public event EventHandler OnUserForceLogout;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,93 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Diagnostics;
|
||||
using System.Text.Json;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.IdentityModel.Abstractions;
|
||||
|
||||
namespace QtCNETAPI.Services
|
||||
{
|
||||
public class LoggingService : IDisposable, ILogger
|
||||
{
|
||||
private DateTime LogDate { get; set; }
|
||||
private string LogFilePath { get; set; }
|
||||
private StreamWriter LogFile { get; set; }
|
||||
public LoggingService()
|
||||
{
|
||||
LogDate = DateTime.Now;
|
||||
LogFilePath = $"./Logs/QtCClientLog_{LogDate:ddMMyyy-hhmm}.log";
|
||||
|
||||
// create log file
|
||||
|
||||
if (!Directory.Exists("./Logs")) Directory.CreateDirectory("./Logs");
|
||||
LogFile = new StreamWriter(File.Create(LogFilePath));
|
||||
|
||||
Debug.WriteLine($"Log File Created At {LogFilePath}");
|
||||
}
|
||||
|
||||
public void LogString(string message)
|
||||
{
|
||||
try
|
||||
{
|
||||
Debug.WriteLine($"({DateTime.Now.ToLocalTime():hh:mm}) {message}");
|
||||
LogFile.WriteLine($"({DateTime.Now.ToLocalTime():hh:mm}) {message}");
|
||||
} catch (ObjectDisposedException)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
public void LogModel<T>(T model)
|
||||
{
|
||||
try
|
||||
{
|
||||
// serialize the model as json
|
||||
string modelSerialized = JsonSerializer.Serialize(model, options: new JsonSerializerOptions { WriteIndented = true });
|
||||
|
||||
// log it
|
||||
Debug.WriteLine($"({DateTime.Now.ToLocalTime():hh:mm}) {modelSerialized}");
|
||||
LogFile.WriteLine($"({DateTime.Now.ToLocalTime():hh:mm}) {modelSerialized}");
|
||||
} catch (ObjectDisposedException)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
LogFile.WriteLine("--- END OF LOG ---");
|
||||
LogFile.Close();
|
||||
LogFile.Dispose();
|
||||
}
|
||||
|
||||
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string> formatter)
|
||||
{
|
||||
try
|
||||
{
|
||||
// format message
|
||||
string message = $"({DateTime.Now.ToLocalTime():hh:mm}) [{logLevel}] {formatter(state, exception)}";
|
||||
|
||||
// log it
|
||||
Debug.WriteLine(message);
|
||||
LogFile.WriteLine(message);
|
||||
} catch (ObjectDisposedException)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsEnabled(LogLevel logLevel) => true;
|
||||
public IDisposable? BeginScope<TState>(TState state) where TState : notnull => default!;
|
||||
}
|
||||
|
||||
public class LoggingServiceProvider(LoggingService? loggingService = null) : ILoggerProvider
|
||||
{
|
||||
public ILogger CreateLogger(string categoryName)
|
||||
{
|
||||
if (loggingService != null) return loggingService;
|
||||
else return new LoggingService();
|
||||
}
|
||||
|
||||
public void Dispose() { }
|
||||
}
|
||||
}
|
||||
@ -1,19 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace qtc_net_client_2.ClientModel
|
||||
{
|
||||
public class ComboBoxItem
|
||||
{
|
||||
public string? Name { get; set; }
|
||||
public object? Value { get; set; }
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return Name ?? string.Empty;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -15,12 +15,12 @@ namespace qtc_net_client_2.ClientModel
|
||||
[JsonPropertyName("minimizeToTray")]
|
||||
[JsonRequired]
|
||||
public bool MinimizeToTray { get; set; } = true;
|
||||
[JsonPropertyName("enableDebugLogs")]
|
||||
[JsonRequired]
|
||||
public bool EnableDebugLogs { get; set; } = false;
|
||||
|
||||
[JsonPropertyName("serverUrl")]
|
||||
[JsonPropertyName("apiEndpoint")]
|
||||
[JsonRequired]
|
||||
public string ServerUrl { get; set; } = "https://qtc.alanmoon.net";
|
||||
public string ApiEndpoint { get; set; } = "https://qtc.alanmoon.net/api";
|
||||
[JsonPropertyName("gatewayEndpoint")]
|
||||
[JsonRequired]
|
||||
public string GatewayEndpoint { get; set; } = "https://qtc.alanmoon.net/chat";
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,148 +0,0 @@
|
||||
using qtc_net_client_2.Properties;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace qtc_net_client_2.Controls
|
||||
{
|
||||
public class ChatMessageControl : Control
|
||||
{
|
||||
public Image? Avatar { get; set; }
|
||||
public string Username = "Username";
|
||||
public string Message = "Message";
|
||||
|
||||
private Font usernameFont = new("Segoe UI", 9, FontStyle.Bold);
|
||||
private Font messageFont = new("Segoe UI", 9, FontStyle.Regular);
|
||||
private Font messageFontBold = new("Segoe UI", 10, FontStyle.Bold);
|
||||
|
||||
public ChatMessageControl()
|
||||
{
|
||||
DoubleBuffered = true;
|
||||
}
|
||||
|
||||
protected override void OnPaint(PaintEventArgs e)
|
||||
{
|
||||
base.OnPaint(e);
|
||||
|
||||
int avatarSize = 32;
|
||||
int padding = 6;
|
||||
|
||||
// first, draw the avatar
|
||||
Rectangle pfpRect = new(padding, padding, avatarSize, avatarSize);
|
||||
e.Graphics.DrawImage(Avatar ?? Resources.DefaultPfp, pfpRect);
|
||||
|
||||
// then draw the username
|
||||
int textLeft = padding * 2 + avatarSize;
|
||||
int textWidth = Width - textLeft - padding;
|
||||
|
||||
Rectangle usernameRect = new(textLeft, padding, textWidth, 20);
|
||||
e.Graphics.DrawString(Username, usernameFont, Brushes.Black, usernameRect);
|
||||
|
||||
// finally draw the message
|
||||
int messageTop = usernameRect.Bottom + 2;
|
||||
|
||||
Rectangle messageRect = new(textLeft, messageTop, textWidth, Height - messageTop - padding);
|
||||
StringFormat fmt = new()
|
||||
{
|
||||
Trimming = StringTrimming.Word,
|
||||
FormatFlags = 0,
|
||||
Alignment = StringAlignment.Near
|
||||
};
|
||||
|
||||
if (Username.Contains("Server"))
|
||||
{
|
||||
e.Graphics.DrawString(Message, messageFontBold, Brushes.Black, messageRect, fmt);
|
||||
return;
|
||||
}
|
||||
|
||||
e.Graphics.DrawString(Message, messageFont, Brushes.Black, messageRect, fmt);
|
||||
}
|
||||
|
||||
protected override void OnResize(EventArgs e)
|
||||
{
|
||||
base.OnResize(e);
|
||||
Height = CalculateHeight(Width);
|
||||
}
|
||||
|
||||
public int CalculateHeight(int width)
|
||||
{
|
||||
int padding = 6;
|
||||
int avatarSize = 32;
|
||||
int textLeft = padding * 2 + avatarSize;
|
||||
int textWidth = width - textLeft - padding;
|
||||
|
||||
using (Graphics g = CreateGraphics())
|
||||
{
|
||||
SizeF usernameSize = g.MeasureString(Username, usernameFont, textWidth);
|
||||
SizeF messageSize = g.MeasureString(Message, messageFont, textWidth);
|
||||
|
||||
int totalHeight = padding + (int)usernameSize.Height + 2 + (int)messageSize.Height + padding + 5;
|
||||
return Math.Max(totalHeight, avatarSize + 2 * padding);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class ChatMessageControlMinimal : Control
|
||||
{
|
||||
public string Username = "Username";
|
||||
public string Message = "Message";
|
||||
|
||||
private Font usernameFont = new("Segoe UI", 9, FontStyle.Bold);
|
||||
private Font messageFont = new("Segoe UI", 9, FontStyle.Regular);
|
||||
|
||||
public ChatMessageControlMinimal()
|
||||
{
|
||||
DoubleBuffered = true;
|
||||
MinimumSize = new Size(150, 20);
|
||||
}
|
||||
|
||||
protected override void OnPaint(PaintEventArgs e)
|
||||
{
|
||||
base.OnPaint(e);
|
||||
|
||||
int padding = 6;
|
||||
|
||||
// first draw the username
|
||||
int textWidth = Width - padding * 2;
|
||||
|
||||
Rectangle usernameRect = new(padding, padding, textWidth, 20);
|
||||
e.Graphics.DrawString(Username, usernameFont, Brushes.Black, usernameRect);
|
||||
|
||||
// finally draw the message
|
||||
int messageTop = usernameRect.Bottom + 2;
|
||||
|
||||
Rectangle messageRect = new(padding, messageTop, textWidth, Height - messageTop - padding);
|
||||
StringFormat fmt = new()
|
||||
{
|
||||
Trimming = StringTrimming.Word,
|
||||
FormatFlags = 0,
|
||||
Alignment = StringAlignment.Near
|
||||
};
|
||||
|
||||
e.Graphics.DrawString(Message, messageFont, Brushes.Black, messageRect, fmt);
|
||||
}
|
||||
|
||||
protected override void OnResize(EventArgs e)
|
||||
{
|
||||
base.OnResize(e);
|
||||
Height = CalculateHeight(Width);
|
||||
}
|
||||
|
||||
public int CalculateHeight(int width)
|
||||
{
|
||||
int padding = 6;
|
||||
int textWidth = width - padding * 2;
|
||||
|
||||
using (Graphics g = CreateGraphics())
|
||||
{
|
||||
SizeF usernameSize = g.MeasureString(Username, usernameFont, textWidth);
|
||||
SizeF messageSize = g.MeasureString(Message, messageFont, textWidth);
|
||||
|
||||
int totalHeight = padding + (int)usernameSize.Height + 2 + (int)messageSize.Height + padding + 5;
|
||||
return totalHeight;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,92 +0,0 @@
|
||||
using Accessibility;
|
||||
using Microsoft.AspNetCore.Mvc.TagHelpers;
|
||||
using qtc_net_client_2.Properties;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace qtc_net_client_2.Controls
|
||||
{
|
||||
public class ContactEntryControl : Control
|
||||
{
|
||||
public Image? Avatar { get; set; }
|
||||
public string Username = "Username";
|
||||
public Color StatusColor = Color.Gray;
|
||||
|
||||
private Font? usernameFont;
|
||||
|
||||
public event EventHandler? ContactDoubleClicked;
|
||||
|
||||
private bool IsHoveredOn;
|
||||
public ContactEntryControl()
|
||||
{
|
||||
// reduce flicker
|
||||
SetStyle(ControlStyles.AllPaintingInWmPaint |
|
||||
ControlStyles.ResizeRedraw |
|
||||
ControlStyles.UserPaint |
|
||||
ControlStyles.OptimizedDoubleBuffer, true);
|
||||
|
||||
Height = 36;
|
||||
}
|
||||
|
||||
protected override void OnPaintBackground(PaintEventArgs pevent) { } // prevent this
|
||||
|
||||
protected override void OnPaint(PaintEventArgs e)
|
||||
{
|
||||
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
|
||||
|
||||
Rectangle rect = ClientRectangle;
|
||||
|
||||
using var brush = new LinearGradientBrush(rect, StatusColor, BackColor, LinearGradientMode.Horizontal);
|
||||
|
||||
Color usernameForeColor = Color.Black;
|
||||
if(IsHoveredOn)
|
||||
{
|
||||
usernameForeColor = Color.White;
|
||||
usernameFont = new Font("Segoe UI", 9, FontStyle.Bold | FontStyle.Underline);
|
||||
}
|
||||
else
|
||||
{
|
||||
usernameFont = new Font("Segoe UI", 9, FontStyle.Bold);
|
||||
}
|
||||
|
||||
e.Graphics.FillRectangle(brush, rect);
|
||||
|
||||
int margin = 6;
|
||||
int imgSize = 32;
|
||||
|
||||
Rectangle avatarRect = new(margin, (Height - imgSize) / 2, imgSize, imgSize);
|
||||
e.Graphics.DrawImage(Avatar ?? Resources.DefaultPfp, avatarRect);
|
||||
|
||||
int textLeft = avatarRect.Right + margin;
|
||||
|
||||
Rectangle rectText = new(textLeft, 0, Width - textLeft - 8, Height - 16);
|
||||
TextRenderer.DrawText(e.Graphics, Username, usernameFont, rectText, usernameForeColor, TextFormatFlags.Left | TextFormatFlags.VerticalCenter);
|
||||
}
|
||||
|
||||
protected override void OnMouseDoubleClick(MouseEventArgs e)
|
||||
{
|
||||
base.OnMouseDoubleClick(e);
|
||||
ContactDoubleClicked?.Invoke(this, EventArgs.Empty);
|
||||
}
|
||||
|
||||
protected override void OnMouseHover(EventArgs e)
|
||||
{
|
||||
base.OnMouseHover(e);
|
||||
IsHoveredOn = true;
|
||||
Invalidate();
|
||||
}
|
||||
|
||||
protected override void OnMouseLeave(EventArgs e)
|
||||
{
|
||||
base.OnMouseLeave(e);
|
||||
IsHoveredOn = false;
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,95 +0,0 @@
|
||||
using qtc_net_client_2.Properties;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel;
|
||||
|
||||
namespace qtc_net_client_2.Controls
|
||||
{
|
||||
public class RoomEntryControl : Control
|
||||
{
|
||||
public Image Image = Resources.RoomsChatIcon;
|
||||
public string RoomName = "Room";
|
||||
public bool HideUserCount = false;
|
||||
public int RoomUserCount = 0;
|
||||
|
||||
private Font? nameFont;
|
||||
private Color nameColor;
|
||||
|
||||
private Font userCountFont = new("Segoe UI", 9, FontStyle.Bold);
|
||||
private Color userCountColor = Color.Gray;
|
||||
|
||||
private bool IsHoveredOn = false;
|
||||
|
||||
public event EventHandler? OnRoomDoubleClicked;
|
||||
public RoomEntryControl()
|
||||
{
|
||||
// reduce flicker
|
||||
SetStyle(ControlStyles.AllPaintingInWmPaint |
|
||||
ControlStyles.ResizeRedraw |
|
||||
ControlStyles.UserPaint |
|
||||
ControlStyles.OptimizedDoubleBuffer, true);
|
||||
|
||||
Height = 36;
|
||||
}
|
||||
|
||||
protected override void OnPaint(PaintEventArgs e)
|
||||
{
|
||||
if(IsHoveredOn)
|
||||
{
|
||||
nameFont = new("Segoe UI", 9, FontStyle.Bold | FontStyle.Underline);
|
||||
nameColor = Color.LightGray;
|
||||
} else
|
||||
{
|
||||
nameFont = new("Segoe UI", 9, FontStyle.Bold);
|
||||
nameColor = Color.Black;
|
||||
}
|
||||
|
||||
int margin = 6;
|
||||
int imageSize = 32;
|
||||
|
||||
Rectangle imageRect = new(margin, (Height - imageSize) / 2, imageSize, imageSize);
|
||||
e.Graphics.DrawImage(Image, imageRect);
|
||||
|
||||
int nameLeft = imageRect.Right + margin;
|
||||
|
||||
Rectangle nameRect = new(nameLeft, 6, Width - nameLeft - 8, Height - 16);
|
||||
TextRenderer.DrawText(e.Graphics, RoomName, nameFont, nameRect, nameColor, TextFormatFlags.Left | TextFormatFlags.VerticalCenter);
|
||||
|
||||
string userCountText = RoomUserCount.ToString();
|
||||
Size countSize = TextRenderer.MeasureText(e.Graphics, userCountText, userCountFont);
|
||||
|
||||
if(!HideUserCount)
|
||||
{
|
||||
int rightPad = 8;
|
||||
int countX = Width - countSize.Width - rightPad;
|
||||
int countY = (Height - countSize.Height) / 2;
|
||||
Point userCountPoint = new(countX, countY);
|
||||
|
||||
TextRenderer.DrawText(e.Graphics, userCountText, userCountFont, userCountPoint, userCountColor, TextFormatFlags.Left);
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnMouseDoubleClick(MouseEventArgs e)
|
||||
{
|
||||
base.OnMouseDoubleClick(e);
|
||||
OnRoomDoubleClicked?.Invoke(this, EventArgs.Empty);
|
||||
}
|
||||
|
||||
protected override void OnMouseHover(EventArgs e)
|
||||
{
|
||||
base.OnMouseHover(e);
|
||||
IsHoveredOn = true;
|
||||
Invalidate();
|
||||
}
|
||||
|
||||
protected override void OnMouseLeave(EventArgs e)
|
||||
{
|
||||
base.OnMouseLeave(e);
|
||||
IsHoveredOn = false;
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
}
|
||||
77
qtc-net-client-2/Forms/ChatRoom.Designer.cs
generated
@ -32,18 +32,17 @@
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ChatRoom));
|
||||
rtxtChatbox = new RichTextBox();
|
||||
btnSend = new Button();
|
||||
rtxtChat = new RichTextBox();
|
||||
lblRoomName = new Label();
|
||||
ilStatusIcons = new ImageList(components);
|
||||
ilProfileImages = new ImageList(components);
|
||||
lvUserList = new ListView();
|
||||
fpnlMessages = new FlowLayoutPanel();
|
||||
ilStatusIcons = new ImageList(components);
|
||||
SuspendLayout();
|
||||
//
|
||||
// rtxtChatbox
|
||||
//
|
||||
rtxtChatbox.Location = new Point(12, 322);
|
||||
rtxtChatbox.Location = new Point(12, 268);
|
||||
rtxtChatbox.Name = "rtxtChatbox";
|
||||
rtxtChatbox.Size = new Size(589, 54);
|
||||
rtxtChatbox.Size = new Size(512, 54);
|
||||
rtxtChatbox.TabIndex = 1;
|
||||
rtxtChatbox.Text = "";
|
||||
rtxtChatbox.KeyDown += rtxtChatbox_KeyDown;
|
||||
@ -53,13 +52,24 @@
|
||||
btnSend.FlatAppearance.BorderSize = 0;
|
||||
btnSend.FlatStyle = FlatStyle.Flat;
|
||||
btnSend.Image = Properties.Resources.SendIcon;
|
||||
btnSend.Location = new Point(607, 322);
|
||||
btnSend.Location = new Point(530, 268);
|
||||
btnSend.Name = "btnSend";
|
||||
btnSend.Size = new Size(75, 54);
|
||||
btnSend.TabIndex = 2;
|
||||
btnSend.UseVisualStyleBackColor = true;
|
||||
btnSend.Click += btnSend_Click;
|
||||
//
|
||||
// rtxtChat
|
||||
//
|
||||
rtxtChat.Font = new Font("Segoe UI", 10F);
|
||||
rtxtChat.HideSelection = false;
|
||||
rtxtChat.Location = new Point(142, 43);
|
||||
rtxtChat.Name = "rtxtChat";
|
||||
rtxtChat.ReadOnly = true;
|
||||
rtxtChat.Size = new Size(463, 219);
|
||||
rtxtChat.TabIndex = 3;
|
||||
rtxtChat.Text = "";
|
||||
//
|
||||
// lblRoomName
|
||||
//
|
||||
lblRoomName.AutoSize = true;
|
||||
@ -72,6 +82,19 @@
|
||||
lblRoomName.TabIndex = 8;
|
||||
lblRoomName.Text = "Room";
|
||||
//
|
||||
// lvUserList
|
||||
//
|
||||
lvUserList.Alignment = ListViewAlignment.Left;
|
||||
lvUserList.Location = new Point(12, 43);
|
||||
lvUserList.MultiSelect = false;
|
||||
lvUserList.Name = "lvUserList";
|
||||
lvUserList.Size = new Size(124, 219);
|
||||
lvUserList.SmallImageList = ilStatusIcons;
|
||||
lvUserList.TabIndex = 9;
|
||||
lvUserList.UseCompatibleStateImageBehavior = false;
|
||||
lvUserList.View = View.SmallIcon;
|
||||
lvUserList.DoubleClick += lvUserList_DoubleClick;
|
||||
//
|
||||
// ilStatusIcons
|
||||
//
|
||||
ilStatusIcons.ColorDepth = ColorDepth.Depth32Bit;
|
||||
@ -82,50 +105,17 @@
|
||||
ilStatusIcons.Images.SetKeyName(2, "Away");
|
||||
ilStatusIcons.Images.SetKeyName(3, "DND");
|
||||
//
|
||||
// ilProfileImages
|
||||
//
|
||||
ilProfileImages.ColorDepth = ColorDepth.Depth32Bit;
|
||||
ilProfileImages.ImageStream = (ImageListStreamer)resources.GetObject("ilProfileImages.ImageStream");
|
||||
ilProfileImages.TransparentColor = Color.Transparent;
|
||||
ilProfileImages.Images.SetKeyName(0, "DefaultPFP");
|
||||
//
|
||||
// lvUserList
|
||||
//
|
||||
lvUserList.Alignment = ListViewAlignment.Left;
|
||||
lvUserList.Location = new Point(12, 43);
|
||||
lvUserList.MultiSelect = false;
|
||||
lvUserList.Name = "lvUserList";
|
||||
lvUserList.Size = new Size(124, 273);
|
||||
lvUserList.SmallImageList = ilStatusIcons;
|
||||
lvUserList.TabIndex = 9;
|
||||
lvUserList.UseCompatibleStateImageBehavior = false;
|
||||
lvUserList.View = View.SmallIcon;
|
||||
lvUserList.DoubleClick += lvUserList_DoubleClick;
|
||||
//
|
||||
// fpnlMessages
|
||||
//
|
||||
fpnlMessages.AutoScroll = true;
|
||||
fpnlMessages.BackColor = Color.White;
|
||||
fpnlMessages.BorderStyle = BorderStyle.Fixed3D;
|
||||
fpnlMessages.FlowDirection = FlowDirection.TopDown;
|
||||
fpnlMessages.Location = new Point(142, 43);
|
||||
fpnlMessages.Name = "fpnlMessages";
|
||||
fpnlMessages.Size = new Size(540, 273);
|
||||
fpnlMessages.TabIndex = 10;
|
||||
fpnlMessages.WrapContents = false;
|
||||
//
|
||||
// ChatRoom
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(7F, 15F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
BackColor = Color.DodgerBlue;
|
||||
ClientSize = new Size(694, 388);
|
||||
Controls.Add(fpnlMessages);
|
||||
ClientSize = new Size(617, 334);
|
||||
Controls.Add(lvUserList);
|
||||
Controls.Add(lblRoomName);
|
||||
Controls.Add(rtxtChat);
|
||||
Controls.Add(btnSend);
|
||||
Controls.Add(rtxtChatbox);
|
||||
DoubleBuffered = true;
|
||||
FormBorderStyle = FormBorderStyle.FixedSingle;
|
||||
Icon = (Icon)resources.GetObject("$this.Icon");
|
||||
MaximizeBox = false;
|
||||
@ -141,10 +131,9 @@
|
||||
#endregion
|
||||
private RichTextBox rtxtChatbox;
|
||||
private Button btnSend;
|
||||
private RichTextBox rtxtChat;
|
||||
private Label lblRoomName;
|
||||
private ImageList ilStatusIcons;
|
||||
private ImageList ilProfileImages;
|
||||
private ListView lvUserList;
|
||||
private FlowLayoutPanel fpnlMessages;
|
||||
private ImageList ilStatusIcons;
|
||||
}
|
||||
}
|
||||
@ -1,63 +1,47 @@
|
||||
using qtc_net_client_2.ClientModel;
|
||||
using qtc_net_client_2.Controls;
|
||||
using qtc_net_client_2.Services;
|
||||
using QtCNETAPI.Dtos.User;
|
||||
using qtc_net_client_2.Services;
|
||||
using QtCNETAPI.Events;
|
||||
using QtCNETAPI.Models;
|
||||
using QtCNETAPI.Services.ApiService;
|
||||
using QtCNETAPI.Services.GatewayService;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace qtc_net_client_2.Forms
|
||||
{
|
||||
public partial class ChatRoom : Form
|
||||
{
|
||||
private readonly IGatewayService _gatewayService;
|
||||
private readonly IApiService _apiService;
|
||||
private readonly AudioService AudioService = new();
|
||||
IGatewayService _gatewayService;
|
||||
IApiService _apiService;
|
||||
AudioService AudioService = new();
|
||||
|
||||
private readonly List<User> RoomUserList = new();
|
||||
private Room? Room;
|
||||
public ChatRoom(IGatewayService gatewayService, IApiService apiService, Room? room = null)
|
||||
private List<User> UserList = new();
|
||||
public ChatRoom(IGatewayService gatewayService, IApiService apiService)
|
||||
{
|
||||
_gatewayService = gatewayService;
|
||||
_apiService = apiService;
|
||||
Room = room;
|
||||
|
||||
// subscribe to server message event
|
||||
_gatewayService.OnRoomMessageReceived += _gatewayService_OnServerMessageReceived;
|
||||
_gatewayService.OnRoomUserListReceived += _gatewayService_OnRoomUserListReceived;
|
||||
_gatewayService.OnRoomDeleted += _gatewayService_OnRoomDeleted;
|
||||
_gatewayService.OnGuestUserJoin += _gatewayService_OnGuestUserJoin;
|
||||
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private async void frmChat_Load(object sender, EventArgs e)
|
||||
private void frmChat_Load(object sender, EventArgs e)
|
||||
{
|
||||
if (Room == null)
|
||||
{
|
||||
// join lobby
|
||||
await _gatewayService.JoinRoomAsync();
|
||||
Room = new Room
|
||||
{
|
||||
Id = "LOBBY",
|
||||
Name = "Lobby"
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
// join selected room
|
||||
await _gatewayService.JoinRoomAsync(Room);
|
||||
}
|
||||
// subscribe to server message event
|
||||
_gatewayService.OnRoomMessageReceived += _gatewayService_OnServerMessageReceived;
|
||||
_gatewayService.OnRoomUserListReceived += _gatewayService_OnRoomUserListReceived;
|
||||
|
||||
// init ui
|
||||
if (_gatewayService.CurrentRoom != null) { Text = $"QtC.NET Client - Chat Room - {_gatewayService.CurrentRoom.Name}"; lblRoomName.Text = _gatewayService.CurrentRoom.Name; }
|
||||
else if (_gatewayService.InLobby) { Text = $"QtC.NET Client - Chat Room - Lobby"; lblRoomName.Text = "Lobby"; }
|
||||
|
||||
Text = $"QtC.NET Client - Chat Room - {Room.Name}";
|
||||
lblRoomName.Text = Room.Name;
|
||||
lvUserList.Clear();
|
||||
|
||||
RoomUserList.Clear();
|
||||
lvUserList.Items.Clear();
|
||||
// always add current user to list i guess
|
||||
lvUserList.Items.Add(_apiService.CurrentUser.Username, _apiService.CurrentUser.Status);
|
||||
}
|
||||
|
||||
private async void frmChat_FormClosing(object sender, FormClosingEventArgs e)
|
||||
@ -66,7 +50,7 @@ namespace qtc_net_client_2.Forms
|
||||
_gatewayService.OnRoomMessageReceived -= _gatewayService_OnServerMessageReceived;
|
||||
_gatewayService.OnRoomUserListReceived -= _gatewayService_OnRoomUserListReceived;
|
||||
|
||||
if (_gatewayService.CurrentRoom != null)
|
||||
if (_gatewayService.CurrentRoom != null || _gatewayService.InLobby)
|
||||
{
|
||||
// leave any room user is in
|
||||
await _gatewayService.LeaveRoomAsync();
|
||||
@ -82,7 +66,7 @@ namespace qtc_net_client_2.Forms
|
||||
|
||||
// send it and clear text box
|
||||
await _gatewayService.PostMessageAsync(message);
|
||||
rtxtChatbox.Text = string.Empty;
|
||||
rtxtChatbox.Clear();
|
||||
AudioService.PlaySoundEffect("sndSendClick");
|
||||
}
|
||||
}
|
||||
@ -110,10 +94,8 @@ namespace qtc_net_client_2.Forms
|
||||
{
|
||||
// get user info and open profile dialog
|
||||
var user = mainForm.UserDirectory.FirstOrDefault(e => e.Username == selectedUser);
|
||||
if (user != null)
|
||||
{
|
||||
var res = await _apiService.GetUserInformationAsync(user.Id);
|
||||
var pfpRes = await _apiService.GetUserProfilePic(user.Id);
|
||||
var res = await _apiService.GetUserInformationAsync(user!.Id);
|
||||
var pfpRes = await _apiService.GetUserProfilePic(user!.Id);
|
||||
|
||||
if (res.Data != null && res.Success)
|
||||
{
|
||||
@ -124,14 +106,12 @@ namespace qtc_net_client_2.Forms
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async void _gatewayService_OnServerMessageReceived(object? sender, EventArgs e)
|
||||
private void _gatewayService_OnServerMessageReceived(object? sender, EventArgs e)
|
||||
{
|
||||
var msgEventArgs = (ServerMessageEventArgs)e;
|
||||
var user = RoomUserList.FirstOrDefault(e => e.Username == msgEventArgs.Message.Split(':')[0]);
|
||||
|
||||
AddMessage(msgEventArgs.Message, user?.Id);
|
||||
AddMessage(msgEventArgs.Message);
|
||||
if (!msgEventArgs.Message.Contains(_apiService.CurrentUser.Username)) AudioService.PlaySoundEffect("sndMessage");
|
||||
}
|
||||
|
||||
@ -139,77 +119,20 @@ namespace qtc_net_client_2.Forms
|
||||
{
|
||||
var args = (RoomListEventArgs)e;
|
||||
|
||||
if (IsHandleCreated && !IsDisposed)
|
||||
{
|
||||
Invoke(async delegate ()
|
||||
{
|
||||
RoomUserList.Clear();
|
||||
lvUserList.Items.Clear();
|
||||
if (!IsHandleCreated) return;
|
||||
|
||||
lvUserList.BeginInvoke(lvUserList.Clear);
|
||||
foreach (var user in args.UserList)
|
||||
{
|
||||
lvUserList.Items.Add(user.Username, user.Status);
|
||||
RoomUserList.Add(user);
|
||||
|
||||
// TODO - probably do this only when a message is received (requires response model change)
|
||||
var pfpRes = await _apiService.GetUserProfilePic(user.Id);
|
||||
if (pfpRes != null && pfpRes.Success && pfpRes.Data != null)
|
||||
{
|
||||
using var ms = new MemoryStream(pfpRes.Data);
|
||||
using var bmp = new Bitmap(ms);
|
||||
ilProfileImages.Images.Add(user.Id, bmp);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
private void _gatewayService_OnGuestUserJoin(object? sender, EventArgs e)
|
||||
{
|
||||
var args = (GuestUserJoinEventArgs)e;
|
||||
AddMessage($"Server: Guest User {args.Username} Has Joined {_gatewayService.CurrentRoom?.Name}");
|
||||
}
|
||||
|
||||
private void _gatewayService_OnRoomDeleted(object? sender, EventArgs e)
|
||||
{
|
||||
if (IsHandleCreated && !IsDisposed)
|
||||
{
|
||||
Invoke(delegate ()
|
||||
{
|
||||
AddMessage($"Server: This Room Was Deleted By An Admin.");
|
||||
lvUserList.Items.Clear();
|
||||
RoomUserList.Clear();
|
||||
|
||||
lvUserList.Enabled = false;
|
||||
rtxtChatbox.Enabled = false;
|
||||
btnSend.Enabled = false;
|
||||
});
|
||||
lvUserList.BeginInvoke(delegate () { lvUserList.Items.Add(user.Username, user.Status); });
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void AddMessage(string message, string? userId = null)
|
||||
private void AddMessage(string message)
|
||||
{
|
||||
if (IsHandleCreated && !IsDisposed)
|
||||
{
|
||||
Invoke((Delegate)delegate ()
|
||||
{
|
||||
var ctrl = new ChatMessageControl()
|
||||
{
|
||||
Username = message.Split(':')[0],
|
||||
Message = message.Split(':')[1].Trim(),
|
||||
Width = fpnlMessages.ClientSize.Width - SystemInformation.VerticalScrollBarWidth
|
||||
};
|
||||
|
||||
if(ilProfileImages.Images.ContainsKey(userId))
|
||||
ctrl.Avatar = ilProfileImages.Images[userId];
|
||||
else ctrl.Avatar = null;
|
||||
|
||||
ctrl.Height = ctrl.CalculateHeight(ctrl.Width);
|
||||
|
||||
fpnlMessages.Controls.Add(ctrl);
|
||||
fpnlMessages.VerticalScroll.Value = fpnlMessages.VerticalScroll.Maximum;
|
||||
fpnlMessages.PerformLayout();
|
||||
});
|
||||
}
|
||||
if (InvokeRequired)
|
||||
Invoke(delegate { rtxtChat.AppendText(message + Environment.NewLine); });
|
||||
else rtxtChat.AppendText(message + Environment.NewLine);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -124,218 +124,93 @@
|
||||
<value>
|
||||
AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs
|
||||
LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu
|
||||
SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAchMAAAJNU0Z0AUkBTAIBAQQB
|
||||
AAEYAQIBGAECARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMAASADAAEBAQABIAYAASD/
|
||||
SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAA+hMAAAJNU0Z0AUkBTAIBAQQB
|
||||
AAHAAQABwAEAARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMAASADAAEBAQABIAYAASD/
|
||||
AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AC4AAwYBBwM0AVQDUQGiA14B0gNaAekDYAHoA10B
|
||||
0QNQAZ8DMQFNAwUBBhgAAwYBBwM0AVQDUQGiA14B0gNaAekDYAHoA10B0QNQAZ8DMQFNAwUBBhgAAwYB
|
||||
BwM0AVQDUQGiA14B0gNaAekDYAHoA10B0QNQAZ8DMQFNAwUBBhgAAwYBBwM0AVQDUQGiA14B0gNaAekD
|
||||
YAHoA10B0QNQAZ8DMQFNAwUBBhQAAyABLQNUAasDWwHkA1oB9QMkAfsDZwH+A2cB/gMkAfsDUwH0A2IB
|
||||
4QNRAaEDHgEqEAADIAEtA1QBqwNbAeQDWgH1ASEBXgEhAfsBQwGAAUMB/gFDAYABQwH+ASEBXgEhAfsD
|
||||
UwH0A2IB4QNRAaEDHgEqEAADIAEtA1QBqwNbAeQDWgH1ASECXgH7AUMCgAH+AUMCgAH+ASECXgH7A1MB
|
||||
9ANiAeEDUQGhAx4BKhAAAyABLQNUAasDWwHkA1oB9QIhAV4B+wJDAYAB/gJDAYAB/gIhAV4B+wNTAfQD
|
||||
YgHhA1EBoQMeASoMAAMbASUDWAG9A1oB8gNrAf4DMAH/AzkB/wM8Af8DNgH/AyoB/wMkAf8DQAH9A14B
|
||||
8ANWAbIDGgEjCAADGwElA1gBvQNaAfIBQwGAAUMB/gEAAVcBAAH/AQABZwEAAf8BAAFsAQAB/wEAAWEB
|
||||
AAH/AQABTAEAAf8BAAFAAQAB/wNAAf0DXgHwA1YBsgEZARoBGQEjCAADGwElA1gBvQNaAfIBQwKAAf4B
|
||||
AAJXAf8BAAJnAf8BAAJsAf8BAAJhAf8BAAJMAf8BAAJAAf8DQAH9A14B8ANWAbIBGQIaASMIAAMbASUD
|
||||
WAG9A1oB8gJDAYAB/gIAAVcB/wIAAWcB/wIAAWwB/wIAAWEB/wIAAUwB/wIAAUAB/wNAAf0DXgHwA1YB
|
||||
sgIZARoBIwQAAwMBBANSAaUDYAHzA0kB/wNVAf8DZQH/A3EB/wN1Af8DcQH/A2QB/wNMAf8DMQH/A2cB
|
||||
/gNiAe4DUAGaAwMBBAMDAQQBUgFTAVIBpQFgAW8BYAHzAQABggEAAf8BAAGZAQAB/wEAAbYBAAH/AQAB
|
||||
zAEAAf8BAAHTAQAB/wEAAcsBAAH/AQABswEAAf8BAAGIAQAB/wEAAVcBAAH/AUMBgAFDAf4DYgHuA1AB
|
||||
mgMDAQQDAwEEAVICUwGlAWACbwHzAQACggH/AQACmQH/AQACtgH/AQACzAH/AQAC0wH/AQACywH/AQAC
|
||||
swH/AQACiAH/AQACVwH/AUMCgAH+A2IB7gNQAZoDAwEEAwMBBAJSAVMBpQJgAW8B8wIAAYIB/wIAAZkB
|
||||
/wIAAbYB/wIAAcwB/wIAAdMB/wIAAcsB/wIAAbMB/wIAAYgB/wIAAVcB/wJDAYAB/gNiAe4DUAGaAwMB
|
||||
BAMtAUQDYAHoA4AB/gNuAf8DewH/A4UB/wOKAf8DjAH/A4oB/wOFAf8DdgH/A1cB/wMyAf8DQAH9A14B
|
||||
3QMqAT8DLQFEAWABaQFgAegBQwGAAUMB/gEAAcYBAAH/AQAB3AEAAf8BAAHuAQAB/wEAAfgBAAH/AQAB
|
||||
+wEAAf8BAAH5AQAB/wEAAe8BAAH/AQAB1AEAAf8BAAGcAQAB/wEAAVoBAAH/A0AB/QNeAd0DKgE/Ay0B
|
||||
RAFgAmkB6AFDAoAB/gEAAsYB/wEAAtwB/wEAAu4B/wEAAvgB/wEAAvsB/wEAAvkB/wEAAu8B/wEAAtQB
|
||||
/wEAApwB/wEAAloB/wNAAf0DXgHdAyoBPwMtAUQCYAFpAegCQwGAAf4CAAHGAf8CAAHcAf8CAAHuAf8C
|
||||
AAH4Af8CAAH7Af8CAAH5Af8CAAHvAf8CAAHUAf8CAAGcAf8CAAFaAf8DQAH9A14B3QMqAT8DTgGVA3cB
|
||||
+AN/Af8DhQH/A4oB/wONAf8DjgH/A44B/wOOAf8DjQH/A4kB/wN3Af8DTQH/AyUB/wNaAfIDSgGLA04B
|
||||
lQFcAXwBXAH4AQAB5QEAAf8BAAHvAQAB/wEAAfgBAAH/AQAB/QEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB
|
||||
/wEAAf8BAAH+AQAB/wEAAfYBAAH/AQAB1QEAAf8BAAGLAQAB/wEAAUEBAAH/A1oB8gNKAYsDTgGVAVwC
|
||||
fAH4AQAC5QH/AQAC7wH/AQAC+AH/AQAC/QH/AQAD/wEAA/8BAAP/AQAC/gH/AQAC9gH/AQAC1QH/AQAC
|
||||
iwH/AQACQQH/A1oB8gNKAYsDTgGVAlwBfAH4AgAB5QH/AgAB7wH/AgAB+AH/AgAB/QH/AgAC/wIAAv8C
|
||||
AAL/AgAB/gH/AgAB9gH/AgAB1QH/AgABiwH/AgABQQH/A1oB8gNKAYsDXwHTA34B/AOTAf8DjgH/A40B
|
||||
/wOOAf8DjgH/A44B/wOOAf8DjgH/A40B/wOFAf8DZwH/AzQB/wNBAfkDWgHEAVsBXwFbAdMBKwF+ASsB
|
||||
/AEOAfsBDgH/AQMB/QEDAf8BAAH+AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB
|
||||
/wEAAf8BAAH9AQAB/wEAAe8BAAH/AQABuQEAAf8BAAFdAQAB/wNBAfkDWgHEAVsCXwHTASsCfgH8AQ4C
|
||||
+wH/AQMC/QH/AQAC/gH/AQAD/wEAA/8BAAP/AQAD/wEAA/8BAAL9Af8BAALvAf8BAAK5Af8BAAJdAf8D
|
||||
QQH5A1oBxAJbAV8B0wIrAX4B/AIOAfsB/wIDAf0B/wIAAf4B/wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAB
|
||||
/QH/AgAB7wH/AgABuQH/AgABXQH/A0EB+QNaAcQDbgH1A4AB/gOfAf8DkwH/A48B/wOOAf8DjgH/A44B
|
||||
/wOOAf8DjgH/A44B/wOLAf8DdwH/A0gB/wNAAf0DYgHhAVoBbgFaAfUBZwGAAWcB/gEnAf8BJwH/AQsB
|
||||
/wELAf8BAQH/AQEB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB
|
||||
/wEAAfkBAAH/AQAB1gEAAf8BAAGBAQAB/wNAAf0DYgHhAVoCbgH1AWcCgAH+AScD/wELA/8BAQP/AQAD
|
||||
/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAC+QH/AQAC1gH/AQACgQH/A0AB/QNiAeECWgFuAfUCZwGAAf4C
|
||||
JwL/AgsC/wIBAv8CAAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAH5Af8CAAHWAf8CAAGBAf8DQAH9A2IB
|
||||
4QNjAfYDgAH+A6sB/wOZAf8DkAH/A44B/wOOAf8DjgH/A44B/wOOAf8DjgH/A40B/wN/Af8DVQH/A0AB
|
||||
/QNeAeIBSAFjAUgB9gOAAf4BQgH/AUIB/wEZAf8BGQH/AQQB/wEEAf8BAAH/AQAB/wEAAf8BAAH/AQAB
|
||||
/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH9AQAB/wEAAeQBAAH/AQABmAEAAf8DQAH9A14B
|
||||
4gFIAmMB9gOAAf4BQgP/ARkD/wEEA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAA/8BAAL9Af8BAALkAf8B
|
||||
AAKYAf8DQAH9A14B4gJIAWMB9gOAAf4CQgL/AhkC/wIEAv8CAAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8C
|
||||
AAH9Af8CAAHkAf8CAAGYAf8DQAH9A14B4gNhAdYDfgH8A7gB/wOjAf8DkwH/A44B/wOOAf8DjgH/A44B
|
||||
/wOOAf8DjgH/A40B/wOCAf8DXAH/A00B+gNaAccBXAFhAVwB1gFkAX4BZAH8AV8B/wFfAf8BLwH/AS8B
|
||||
/wEMAf8BDAH/AQEB/wEBAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB
|
||||
/gEAAf8BAAHqAQAB/wEAAaUBAAH/A00B+gNaAccBXAJhAdYBZAJ+AfwBXwP/AS8D/wEMA/8BAQP/AQAD
|
||||
/wEAA/8BAAP/AQAD/wEAA/8BAAL+Af8BAALqAf8BAAKlAf8DTQH6A1oBxwJcAWEB1gJkAX4B/AJfAv8C
|
||||
LwL/AgwC/wIBAv8CAAL/AgAC/wIAAv8CAAL/AgAC/wIAAf4B/wIAAeoB/wIAAaUB/wNNAfoDWgHHA1AB
|
||||
mgNqAfkDxQH/A7IB/wOcAf8DkQH/A44B/wOOAf8DjgH/A44B/wOPAf8DjgH/A4MB/wNgAf8DWgHyA0wB
|
||||
kANQAZoDagH5AXwB/wF8Af8BUQH/AVEB/wEfAf8BHwH/AQcB/wEHAf8BAQH/AQEB/wEAAf8BAAH/AQAB
|
||||
/wEAAf8BAAH/AQAB/wECAf8BAgH/AQIB/gECAf8BAAHrAQAB/wEAAa0BAAH/AVoBawFaAfIDTAGQA1AB
|
||||
mgNqAfkBfAP/AVED/wEfA/8BBwP/AQED/wEAA/8BAAP/AQAD/wECA/8BAgL+Af8BAALrAf8BAAKtAf8B
|
||||
WgJrAfIDTAGQA1ABmgNqAfkCfAL/AlEC/wIfAv8CBwL/AgEC/wIAAv8CAAL/AgAC/wICAv8CAgH+Af8C
|
||||
AAHrAf8CAAGtAf8CWgFrAfIDTAGQAy8BSQNsAesDgAH+A8YB/wOuAf8DnAH/A5MB/wOQAf8DjwH/A5AB
|
||||
/wOTAf8DkwH/A4UB/wNAAf0DYAHgAy0BRQMvAUkDbAHrA4AB/gF/Af8BfwH/AUkB/wFJAf8BHwH/AR8B
|
||||
/wEMAf8BDAH/AQUB/wEFAf8BAwH/AQMB/wEFAf8BBQH/AQoB/wEKAf8BCgH+AQoB/wEBAe0BAQH/AUAB
|
||||
tgFAAf0BYAFmAWAB4AMtAUUDLwFJA2wB6wOAAf4BfwP/AUkD/wEfA/8BDAP/AQUD/wEDA/8BBQP/AQoD
|
||||
/wEKAv4B/wEBAu0B/wFAArYB/QFgAmYB4AMtAUUDLwFJA2wB6wOAAf4CfwL/AkkC/wIfAv8CDAL/AgUC
|
||||
/wIDAv8CBQL/AgoC/wIKAf4B/wIBAe0B/wJAAbYB/QJgAWYB4AMtAUUDAwEEA1YBrgNuAfUD2QH/A8sB
|
||||
/wO3Af8DpwH/A50B/wOaAf8DnAH/A58B/wObAf8DiQH/A2gB8ANSAaMDAwEEAwMBBANWAa4DbgH1AagB
|
||||
/wGoAf8BiQH/AYkB/wFcAf8BXAH/ATcB/wE3Af8BIgH/ASIB/wEbAf8BGwH/AR8B/wEfAf8BJgH/ASYB
|
||||
/wEdAf8BHQH/AQUB8wEFAf8BXgFoAV4B8ANSAaMDAwEEAwMBBANWAa4DbgH1AagD/wGJA/8BXAP/ATcD
|
||||
/wEiA/8BGwP/AR8D/wEmA/8BHQP/AQUC8wH/AV4CaAHwA1IBowMDAQQDAwEEA1YBrgNuAfUCqAL/AokC
|
||||
/wJcAv8CNwL/AiIC/wIbAv8CHwL/AiYC/wIdAv8CBQHzAf8CXgFoAfADUgGjAwMBBAQAAxwBJwNdAccD
|
||||
YwH2A4AB/gPXAf8DzAH/A8IB/wO7Af8DtwH/A7EB/wOAAf4DaAH0A1kBvAMbASYIAAMcAScDXQHHA2MB
|
||||
9gOAAf4BpQH/AaUB/wGLAf8BiwH/AXQB/wF0Af8BZgH/AWYB/wFcAf8BXAH/AU4B/wFOAf8BcwGAAXMB
|
||||
/gFTAWgBUwH0AVcBWQFXAbwDGwEmCAADHAEnA10BxwNjAfYDgAH+AaUD/wGLA/8BdAP/AWYD/wFcA/8B
|
||||
TgP/AXMCgAH+AVMCaAH0AVcCWQG8AxsBJggAAxwBJwNdAccDYwH2A4AB/gKlAv8CiwL/AnQC/wJmAv8C
|
||||
XAL/Ak4C/wJzAYAB/gJTAWgB9AJXAVkBvAMbASYMAAMhATADWQG2A2IB7gN9AfoDvgH9A9QB/wPMAf8D
|
||||
vgH9A2oB+QNsAesDVQGsAx8BLBAAAyEBMANZAbYDYgHuA30B+gGuAb4BrgH9AZ8B/wGfAf8BjAH/AYwB
|
||||
/wFAAb4BQAH9AWgBagFoAfkBYQFsAWEB6wNVAawDHwEsEAADIQEwA1kBtgNiAe4DfQH6Aa4CvgH9AZ8D
|
||||
/wGMA/8BQAK+Af0BaAJqAfkBYQJsAesDVQGsAx8BLBAAAyEBMANZAbYDYgHuA30B+gKuAb4B/QKfAv8C
|
||||
jAL/AkABvgH9AmgBagH5AmEBbAHrA1UBrAMfASwUAAMGAQcDNgFYA1UBrANmAeUDfgH8A18B+wNlAeID
|
||||
UwGnAzMBUQMGAQcYAAMGAQcDNgFYA1UBrANmAeUDfgH8AV8BZwFfAfsDZQHiA1MBpwMzAVEDBgEHGAAD
|
||||
BgEHAzYBWANVAawDZgHlA34B/AFfAmcB+wNlAeIDUwGnAzMBUQMGAQcYAAMGAQcDNgFYA1UBrANmAeUD
|
||||
fgH8Al8BZwH7A2UB4gNTAacDMwFRAwYBBwwAAUIBTQE+BwABPgMAASgDAAFAAwABIAMAAQEBAAEBBgAB
|
||||
ARYAA/+BAAHgAQcB4AEHAeABBwHgAQcBwAEDAcABAwHAAQMBwAEDAYABAQGAAQEBgAEBAYABAVAAAYAB
|
||||
AQGAAQEBgAEBAYABAQHAAQMBwAEDAcABAwHAAQMB4AEHAeABBwHgAQcB4AEHCw==
|
||||
</value>
|
||||
</data>
|
||||
<metadata name="ilProfileImages.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>132, 12</value>
|
||||
</metadata>
|
||||
<data name="ilProfileImages.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>
|
||||
AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs
|
||||
LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu
|
||||
SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAlhsAAAJNU0Z0AUkBTAMBAQAB
|
||||
QAEBAUABAQEgAQABIAEABP8BIQEACP8BQgFNATYHAAE2AwABKAMAAYADAAEgAwABAQEAASAGAAFAEgAC
|
||||
RwFGAYACRwFGAYACRwFGAYABRwJGAYABRwJGAYACRwFGAYACRwFGAYABRwJGAYABRwJGAYABRwJGAYAD
|
||||
RgGAAkcBRgGAAkcBRgGAAkcBRgGAAkcBRgGAAkcBRgGAAkcBRgGAAkcBRgGAAkcBRgGAAkcBRgGAAkcB
|
||||
RgGAAkcBRgGAA0YBgAFHAkYBgAFHAkYBgAFHAkYBgAFHAkYBgAFHAkYBgAJHAUYBgAJHAUYBgAJHAUYB
|
||||
gAMqAUD/AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRgEBAv8BRwEBAv8BSAEAAf8B7QFGAQEB
|
||||
/wHbAUMBAgH/AZEBNgEBAf8BRgEpAQAB/wF1AVABAQH/AaMBdwECAf8BzAGQAQkB/wH0AagBEAH/AfkB
|
||||
rQEIAf8B/gGxAQAB/wH3Aa4BBgH/Ae8BqwEMAf8BygGOAQcB/wGlAXABAgH/AXABTgEBAf8BOwEsAQAB
|
||||
/wFZAScBAAH/AXcBIgEAAf8BuwE0AQIB/wH+AUYBBAL/AUcBAwL/AUcBAQL/AUcBAQL/AUcBAQH/AkcB
|
||||
RgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUYBAgL/AUYBAwH/AfsBRwEBAf8B9wFIAQAB/wHaAVAB
|
||||
AQH/Ab0BWAEBAf8BrgFjAQEB/wGgAW8BAAH/AbgBggEBAf8B0QGWAQEB/wHkAaMBBQH/AfgBrwEJAf8B
|
||||
+wGxAQUC/wGzAQEB/wH7AbEBBAH/AfcBsAEIAf8B5AGiAQQB/wHRAZQBAQH/AbcBgwECAf8BnQFyAQIB
|
||||
/wGDAVEBAQH/AWgBMQEAAf8BlAEzAQEB/wHBATYBAwH/AeABPwECAv8BSAEBAv8BRwEBAv8BRwEBAf8C
|
||||
RwFGAYD/AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8BRgEDAv8BRQEEAf8B9wFGAQIB/wHvAUcBAAH/AccB
|
||||
WgEAAf8BnwFtAQAB/wHMAZEBAAH/AfkBtAEAAf8B/AG1AQAC/wG1AQAB/wH9AbYBAQH/AfsBtgEBAf8B
|
||||
/QG1AQEC/wG0AQEC/wG0AQIC/wG0AQMB/wH+AbYBAgH/Af0BtwEAAf8B/gG3AQIC/wG3AQQB/wGsAXwB
|
||||
AgH/AVkBQAEAAf8BbgEzAQEB/wGDASUBAQH/AcEBNwEBAf8B/gFIAQAC/wFIAQEC/wFHAQEB/wJHAUYB
|
||||
gP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQIC/wFHAQIB/wHyAUwBAQH/AeYBUgEAAf8B2gFxAQAB
|
||||
/wHPAZABAAH/AeYBogEAAf8B/AG1AQEB/wH+AbUBAQL/AbUBAQH/Af4BtQEBAf8B/QG2AQEB/wH+AbUB
|
||||
AQL/AbUBAQL/AbUBAgL/AbUBAgL/AbUBAQH/Af4BtgEBAf8B/QG0AQEB/wH7AbIBAgH/AdQBmAEDAf8B
|
||||
rAF/AQMB/wGHAVUBAgH/AWMBKwEBAf8BrwE5AQEB/wH8AUgBAQH/Af4BRwEBAv8BRwEBAf8CRwFGAYD/
|
||||
AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8BSAEBAv8BSQEAAf8B7gFTAQAB/wHcAVwBAAH/Ae4BiAEAAv8B
|
||||
swEAAv8BtAEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8B
|
||||
tQEBAv8BtQEBAv8BtQEBAf8B+wGxAQEB/wH3AawBAAH/AfsBtQEDAv8BvgEGAf8BoQF3AQQB/wFCATAB
|
||||
AQH/AZ4BPAECAf8B+gFHAQIB/wH9AUcBAgL/AUcBAQH/AkcBRgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcB
|
||||
AQL/AUgBAQL/AUkBAAH/AfYBZAEQAf8B7gF/ASEB/wH2AZoBEAL/AbUBAAL/AbUBAQL/AbUBAQL/AbUB
|
||||
AgL/AbUBAgL/AbUBAgL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQH/Af0B
|
||||
swEBAf8B+wGxAQEB/wH9AbUBAwL/AboBBQH/AaQBdwEDAf8BSQE0AQEB/wGjAT0BAgH/Af0BRgEDAf8B
|
||||
/gFHAQIC/wFHAQEB/wJHAUYBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFIAQEB/wH+AUgBAAL/AXUB
|
||||
IQL/AaIBQQL/AawBIQL/AbYBAAL/AbYBAQL/AbUBAQL/AbUBAgL/AbQBAwL/AbUBAgL/AbUBAQL/AbUB
|
||||
AQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbYBAwL/AbYBBAH/AagB
|
||||
dwECAf8BUAE3AQAB/wGoAT4BAgL/AUUBBAL/AUYBAwL/AUcBAQH/AkcBRgGA/wCBAAH/AUcBAQL/AUcB
|
||||
AQL/AUcBAQL/AUcBAQL/AUgBAQL/AV8BEwL/AXcBJgL/AZwBKAL/AcIBKgL/AbwBFQL/AbYBAQL/AbUB
|
||||
AQL/AbUBAgL/AbUBAgL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAgL/AbUBAgL/AbUB
|
||||
AQL/AbYBAQH/Af4BtgEBAf8B/QG2AQIB/wG9AXkBAQH/AX4BPQEAAf8BvgFCAQEC/wFHAQIC/wFHAQIC
|
||||
/wFHAQEB/wJHAUYBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFJAQYC/wFLAQoC
|
||||
/wGMAS8C/wHNAVMC/wHCASoC/wG2AQAC/wG2AQEC/wG1AQEC/wG1AQEC/wG1AQEC/wG1AQEC/wG1AQEC
|
||||
/wG1AQEC/wG1AQEC/wG1AQIC/wG0AQMC/wG1AQIC/wG2AQAB/wH9AbYBAAH/AfoBtQEAAf8B0wF8AQAB
|
||||
/wGsAUMBAAH/AdUBRgEAAf8B/gFIAQAC/wFIAQEC/wFHAQEB/wJHAUYBgP8AgQAB/wFHAQEC/wFHAQEC
|
||||
/wFHAQEC/wFHAQEC/wFGAQIB/wH+AUgBAwH/Af0BSQEFAf8B7wFrARwB/wHhAY0BNAH/AfABrQE7Av8B
|
||||
zgFDAv8BwQEjAv8BtAEEAv8BtQECAv8BtgEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtgEBAf8B/gG0AQEB
|
||||
/wH+AbMBAgH/Af4BtwEJAv8BuwEQAf8B/gG0AQ0B/wH9Aa0BCgH/AekBeAEFAf8B1gFDAQAB/wHqAUYB
|
||||
AAL/AUgBAAL/AUgBAQL/AUcBAQH/AkcBRgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUYBAgL/AUUB
|
||||
AgH/Af0BRgEBAf8B+gFHAQAB/wHfAUoBCgH/AcMBTAEUAf8B4QGZAU0C/wHlAYYC/wHMAUYC/wGzAQYC
|
||||
/wG1AQMC/wG2AQAC/wG2AQEC/wG1AQEC/wG2AQEC/wG2AQAB/wH+AbQBAAH/AfwBsgEAAf8B/gG5ARAC
|
||||
/wG/ASAC/wGyARoC/wGkARQC/wF0AQoC/wFDAQAC/wFGAQAC/wFIAQAC/wFIAQEC/wFHAQEB/wJHAUYB
|
||||
gP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFGAQIB/wH+AUcBAQH/Af0BRwEBAf8B7wFHAQYB
|
||||
/wHhAUgBCwH/AfABcAEnAv8BmAFDAf8B/gGgATwB/wH9AagBNAH/Af4BugFCAv8BzAFQAv8BzAFOAv8B
|
||||
ywFNAv8ByAFHAv8BxgFCAf8B/gHBAT8B/wH+Ab0BPAH/Af4BoQEnAv8BhgESAv8BfQEOAv8BdQELAv8B
|
||||
XQEGAv8BRQEBAv8BRgEBAv8BSAEBAv8BRwEBAv8BRwEBAf8CRwFGAYD/AIEAAf8BRwEBAv8BRwEBAv8B
|
||||
RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRQECAv8BQwECAv8BRwEBAv8BSwEAAf8B/QF0ATEB
|
||||
/wH7AZ0BYgH/Af0BwAGBAv8B4gGgAv8B4gGcAv8B4QGYAv8B2wGOAv8B1QGEAv8BzgF+Av8BxwF3Av8B
|
||||
igE9Av8BTAEDAv8BSQEDAv8BRgECAv8BRwECAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8C
|
||||
RwFGAYD/AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8B/gFGAQIB
|
||||
/wH+AUUBAwH/Af4BSAECAv8BSwEAAf8B+QFdARkB/wHyAW8BMwH/Ac0BewFBAf8BpwGHAVAB/wGkAYgB
|
||||
TgH/AaABigFMAf8BowGGAUoB/wGnAYMBSQH/AbcBfgFCAf8ByAF5ATwB/wHjAWEBHwL/AUoBAgL/AUgB
|
||||
AgL/AUcBAgL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQH/AkcBRgGA/wCBAAH/AUcB
|
||||
AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQH/Af4BRwEDAf8B/AFGAQQB/wH+AUgB
|
||||
AgL/AUoBAAH/AfQBRQECAf8B6QFAAQMB/wGcATYBAgH/AU8BLAEAAf8BSAEvAQAB/wFBATIBAAH/AUgB
|
||||
MQEHAf8BTgEwAQ0B/wFvAS0BBwH/AZABKgEAAf8ByAE5AQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC
|
||||
/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEB/wJHAUYBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC
|
||||
/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEB/wH+AUcBAgH/Af4BRwECAf8B/gFGAQEC/wFFAQEB/wHhAU0B
|
||||
AQH/AcMBVAECAf8BtQFhAQEB/wGnAW8BAAH/AaMBcAEAAf8BnwFxAQAB/wGjAXIBAwH/AacBcgEHAf8B
|
||||
hwFPAQMB/wFoASwBAAH/AaABNQEAAf8B2AE/AQEB/wHrAUMBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB
|
||||
AQL/AUcBAQL/AUcBAQL/AUcBAQH/AkcBRgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB
|
||||
AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAAL/AUQBAQL/AUABAQH/Ac4BVAEBAf8BnQFoAQAB/wHOAY0B
|
||||
AAL/AbEBAAH/Af4BsQEAAf8B/AGwAQAB/wH+AbIBAAL/AbQBAAH/AaABcQEAAf8BQAEtAQAB/wF4ATIB
|
||||
AAH/AbABNwEAAf8B2AE/AQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEB
|
||||
/wJHAUYBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQIC
|
||||
/wFGAQIB/wH2AUUBAQH/Ae0BRQEBAf8B3gFqAQEB/wHOAZABAgH/AecBogEBAv8BtAEAAf8B/gGzAQEB
|
||||
/wH+AbIBAgH/Af4BtAEDAv8BtQEDAf8BzgGRAQMB/wGdAWwBAgH/AZMBSwEBAf8BiQErAQAB/wHEATkB
|
||||
AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQH/AkcBRgGA/wCBAAH/AUcB
|
||||
AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUYBAwL/AUUBBAH/Ae0BRwECAf8B
|
||||
2wFJAQAB/wHtAYABAgL/AbcBBAL/AbcBAgL/AbcBAAL/AbYBAgL/AbQBBAL/AbUBBQL/AbYBBgH/Af0B
|
||||
sQEFAf8B+gGrAQQB/wGuAWUBAgH/AWIBHgEAAf8BsQEzAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC
|
||||
/wFHAQEC/wFHAQEC/wFHAQEB/wJHAUYBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC
|
||||
/wFHAQEC/wFHAQEC/wFHAQIC/wFHAQIB/wHqAUkBAQH/AdYBSwEAAf8B6wGAAQMC/wG1AQYC/wG2AQMC
|
||||
/wG2AQEC/wG1AQIC/wG1AQMC/wG1AQMC/wG2AQQB/wH+AbQBAwH/Af0BsgECAf8BrgFrAQEB/wFfASQB
|
||||
AAH/Aa8BNQEBAv8BRwECAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8CRwFGAYD/
|
||||
AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BSAEBAf8B/gFIAQAB
|
||||
/wHoAUsBAAH/AdEBTQEAAf8B6AGAAQQC/wGzAQcC/wG0AQQC/wG1AQEC/wG1AQEC/wG1AQEC/wG1AQEC
|
||||
/wG1AQEC/wG3AQEC/wG4AQAB/wGtAXEBAAH/AVsBKQEAAf8BrQE4AQEC/wFGAQIC/wFHAQIC/wFHAQEC
|
||||
/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEB/wJHAUYBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC
|
||||
/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFIAQEB/wHzAUoBAAH/AecBTQEAAf8B8wGGAQ4C/wG/ARwC
|
||||
/wG6AQ4B/wH+AbYBAQL/AbYBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQH/AcEBcQEAAf8B
|
||||
gwEuAQAB/wHBAToBAQL/AUcBAgL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQH/AkcB
|
||||
RgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB
|
||||
AQH/Af4BSgEBAf8B/QFNAQAB/wH+AYwBGQL/AcoBMQH/Af4BwQEZAf8B/QG3AQAB/wH+AbYBAQL/AbUB
|
||||
AQL/AbUBAQL/AbUBAQL/AbQBAQL/AbIBAQH/AdUBcgEBAf8BqwEyAQAB/wHVAT0BAQL/AUcBAQL/AUcB
|
||||
AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQH/AkcBRgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcB
|
||||
AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUgBAQH/Af4BSgEAAv8BjQE2Av8B
|
||||
0QFsAf8B+wHHAUcB/wH3Ab4BIgH/AfsBuQESAv8BtQECAf8B/QG1AQgB/wH8AbYBDQH/AfsBrwENAf8B
|
||||
+wGoAQ0B/wHoAXIBCAH/AdUBPAEDAf8B6gFCAQIC/wFIAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC
|
||||
/wFHAQEC/wFHAQEB/wJHAUYBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC
|
||||
/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFGAQAC/wGPAVMC/wHYAaYB/wH4Ac4BdQH/AfEBxAFEAf8B
|
||||
+AG8ASQC/wG0AQMB/wH8AbYBDgH/AfgBtwEZAf8B+AGrARkB/wH3AZ4BGAH/AfsBcgEPAv8BRQEGAv8B
|
||||
RwEDAv8BSAEAAv8BSAEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8CRwFGAYD/AIEAAf8B
|
||||
RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BSAEBAf8B/QFIAQAB
|
||||
/wH7AUgBAAH/Af0BbgEsAv8BlAFZAf8B/AGOAT8B/wH4AYgBJQH/Ae8BhAEUAf8B5gGBAQMB/wHtAYEB
|
||||
CAH/AfUBgQEOAf8B+AF5AQ8B/wH7AXIBEAH/Af0BXQEJAv8BRwEDAv8BRwECAv8BSAEBAv8BRwEBAv8B
|
||||
RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8CRwFGAYD/AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8B
|
||||
RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BSAEBAf8B/gFIAQAB/wH6AUkBAAH/AfYBSQEAAf8B+wFNAQYC
|
||||
/wFQAQsC/wFOAQkC/wFMAQYB/wHmAU0BBAH/AcwBTQECAf8B3wFMAQMB/wHyAUoBAwH/AfkBSAEFAv8B
|
||||
RgEHAv8BSAEEAf8B/gFJAQAC/wFIAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC
|
||||
/wFHAQEB/wJHAUYBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC
|
||||
/wFHAQEC/wFIAQEB/wH9AUgBAQH/AfsBSAEBAf8B/QFKAQMC/wFMAQYC/wFLAQUC/wFKAQQB/wHyAUoB
|
||||
AwH/AeYBSgECAf8B7wFJAQIB/wH5AUkBAgH/AfwBSAEDAv8BRwEEAv8BRwECAv8BSAEBAv8BSAEBAv8B
|
||||
RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8CRwFGAYD/AIEAAf8BRwEBAv8B
|
||||
RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8B
|
||||
RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8B
|
||||
RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8C
|
||||
RwFGAYD/AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8B
|
||||
RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8B
|
||||
RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8B
|
||||
RwEBAv8BRwEBAv8BRwEBAf8CRwFGAYD/AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8B
|
||||
RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8B
|
||||
RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8B
|
||||
RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8CRwFGAYD/AIEAAUIBTQE+BwABPgMAASgD
|
||||
AAGAAwABIAMAAQEBAAEBBgABAhYAA///AP8AAwAL
|
||||
YAHoA10B0QNQAZ8DMQFNAwUBBhQAAyABLQNUAasDWwHkA1UB9QMkAfsDPAH+AzwB/gMkAfsDUwH0A2IB
|
||||
4QNRAaEDHgEqEAADIAEtA1QBqwNbAeQBSwFaAUsB9QEhAVgBIQH7ARgBWAEYAf4BGAFYARgB/gEhAVgB
|
||||
IQH7A1MB9ANiAeEDUQGhAx4BKhAAAyABLQNUAasDWwHkAUsCWgH1ASECWAH7ARgCWAH+ARgCWAH+ASEC
|
||||
WAH7A1MB9ANiAeEDUQGhAx4BKhAAAyABLQNUAasDWwHkAksBWgH1AiEBWAH7AhgBWAH+AhgBWAH+AiEB
|
||||
WAH7A1MB9ANiAeEDUQGhAx4BKgwAAxsBJQNYAb0DWgHyA0AB/gMwAf8DOQH/AzwB/wM2Af8DKgH/AyQB
|
||||
/wNAAf0DXgHwA1YBsgMaASMIAAMbASUDWAG9A1oB8gEYAWABGAH+AQABVwEAAf8BAAFnAQAB/wEAAWwB
|
||||
AAH/AQABYQEAAf8BAAFMAQAB/wEAAUABAAH/ATABQAEwAf0BWgFeAVoB8ANWAbIBGQEaARkBIwgAAxsB
|
||||
JQNYAb0DWgHyARgCYAH+AQACVwH/AQACZwH/AQACbAH/AQACYQH/AQACTAH/AQACQAH/ATACQAH9AVoC
|
||||
XgHwA1YBsgEZAhoBIwgAAxsBJQNYAb0DWgHyAhgBYAH+AgABVwH/AgABZwH/AgABbAH/AgABYQH/AgAB
|
||||
TAH/AgABQAH/AjABQAH9AloBXgHwA1YBsgIZARoBIwQAAwMBBANSAaUDYAHzA0kB/wNVAf8DZQH/A3EB
|
||||
/wN1Af8DcQH/A2QB/wNMAf8DMQH/AzwB/gNiAe4DUAGaAwMBBAMDAQQBUgFTAVIBpQFWAW8BVgHzAQAB
|
||||
ggEAAf8BAAGZAQAB/wEAAbYBAAH/AQABzAEAAf8BAAHTAQAB/wEAAcsBAAH/AQABswEAAf8BAAGIAQAB
|
||||
/wEAAVcBAAH/ARgBWAEYAf4BXwFiAV8B7gNQAZoDAwEEAwMBBAFSAlMBpQFWAm8B8wEAAoIB/wEAApkB
|
||||
/wEAArYB/wEAAswB/wEAAtMB/wEAAssB/wEAArMB/wEAAogB/wEAAlcB/wEYAlgB/gFfAmIB7gNQAZoD
|
||||
AwEEAwMBBAJSAVMBpQJWAW8B8wIAAYIB/wIAAZkB/wIAAbYB/wIAAcwB/wIAAdMB/wIAAcsB/wIAAbMB
|
||||
/wIAAYgB/wIAAVcB/wIYAVgB/gJfAWIB7gNQAZoDAwEEAy0BRANgAegDewH+A24B/wN7Af8DhQH/A4oB
|
||||
/wOMAf8DigH/A4UB/wN2Af8DVwH/AzIB/wNAAf0DXgHdAyoBPwMtAUQBYAFpAWAB6AEYAYQBGAH+AQAB
|
||||
xgEAAf8BAAHcAQAB/wEAAe4BAAH/AQAB+AEAAf8BAAH7AQAB/wEAAfkBAAH/AQAB7wEAAf8BAAHUAQAB
|
||||
/wEAAZwBAAH/AQABWgEAAf8BMAFAATAB/QNeAd0DKgE/Ay0BRAFgAmkB6AEYAoQB/gEAAsYB/wEAAtwB
|
||||
/wEAAu4B/wEAAvgB/wEAAvsB/wEAAvkB/wEAAu8B/wEAAtQB/wEAApwB/wEAAloB/wEwAkAB/QNeAd0D
|
||||
KgE/Ay0BRAJgAWkB6AIYAYQB/gIAAcYB/wIAAdwB/wIAAe4B/wIAAfgB/wIAAfsB/wIAAfkB/wIAAe8B
|
||||
/wIAAdQB/wIAAZwB/wIAAVoB/wIwAUAB/QNeAd0DKgE/A04BlQN3AfgDfwH/A4UB/wOKAf8DjQH/A44B
|
||||
/wOOAf8DjgH/A40B/wOJAf8DdwH/A00B/wMlAf8DWgHyA0oBiwNOAZUBQgGBAUIB+AEAAeUBAAH/AQAB
|
||||
7wEAAf8BAAH4AQAB/wEAAf0BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/gEAAf8BAAH2AQAB
|
||||
/wEAAdUBAAH/AQABiwEAAf8BAAFBAQAB/wNaAfIDSgGLA04BlQFCAoEB+AEAAuUB/wEAAu8B/wEAAvgB
|
||||
/wEAAv0B/wEAA/8BAAP/AQAD/wEAAv4B/wEAAvYB/wEAAtUB/wEAAosB/wEAAkEB/wNaAfIDSgGLA04B
|
||||
lQJCAYEB+AIAAeUB/wIAAe8B/wIAAfgB/wIAAf0B/wIAAv8CAAL/AgAC/wIAAf4B/wIAAfYB/wIAAdUB
|
||||
/wIAAYsB/wIAAUEB/wNaAfIDSgGLA18B0wN+AfwDkwH/A44B/wONAf8DjgH/A44B/wOOAf8DjgH/A44B
|
||||
/wONAf8DhQH/A2cB/wM0Af8DQQH5A1oBxAFbAV8BWwHTASsBsAErAfwBDgH7AQ4B/wEDAf0BAwH/AQAB
|
||||
/gEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/QEAAf8BAAHvAQAB
|
||||
/wEAAbkBAAH/AQABXQEAAf8DQQH5A1oBxAFbAl8B0wErArAB/AEOAvsB/wEDAv0B/wEAAv4B/wEAA/8B
|
||||
AAP/AQAD/wEAA/8BAAP/AQAC/QH/AQAC7wH/AQACuQH/AQACXQH/A0EB+QNaAcQCWwFfAdMCKwGwAfwC
|
||||
DgH7Af8CAwH9Af8CAAH+Af8CAAL/AgAC/wIAAv8CAAL/AgAC/wIAAf0B/wIAAe8B/wIAAbkB/wIAAV0B
|
||||
/wNBAfkDWgHEA24B9QOAAf4DnwH/A5MB/wOPAf8DjgH/A44B/wOOAf8DjgH/A44B/wOOAf8DiwH/A3cB
|
||||
/wNIAf8DQAH9A2IB4QFTAXYBUwH1ATwBzwE8Af4BJwH/AScB/wELAf8BCwH/AQEB/wEBAf8BAAH/AQAB
|
||||
/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH5AQAB/wEAAdYBAAH/AQAB
|
||||
gQEAAf8BMAFAATAB/QNiAeEBUwJ2AfUBPALPAf4BJwP/AQsD/wEBA/8BAAP/AQAD/wEAA/8BAAP/AQAD
|
||||
/wEAA/8BAAL5Af8BAALWAf8BAAKBAf8BMAJAAf0DYgHhAlMBdgH1AjwBzwH+AicC/wILAv8CAQL/AgAC
|
||||
/wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAB+QH/AgAB1gH/AgABgQH/AjABQAH9A2IB4QNtAfYDgAH+A6sB
|
||||
/wOZAf8DkAH/A44B/wOOAf8DjgH/A44B/wOOAf8DjgH/A40B/wN/Af8DVQH/A0AB/QNeAeIBSAF6AUgB
|
||||
9gFfAc8BXwH+AUIB/wFCAf8BGQH/ARkB/wEEAf8BBAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB
|
||||
/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/QEAAf8BAAHkAQAB/wEAAZgBAAH/ATABQAEwAf0DXgHiAUgC
|
||||
egH2AV8CzwH+AUID/wEZA/8BBAP/AQAD/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAC/QH/AQAC5AH/AQAC
|
||||
mAH/ATACQAH9A14B4gJIAXoB9gJfAc8B/gJCAv8CGQL/AgQC/wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAC
|
||||
/wIAAf0B/wIAAeQB/wIAAZgB/wIwAUAB/QNeAeIDYQHWA34B/AO4Af8DowH/A5MB/wOOAf8DjgH/A44B
|
||||
/wOOAf8DjgH/A44B/wONAf8DggH/A1wB/wNNAfoDWgHHAVwBYQFcAdYBZAG0AWQB/AFfAf8BXwH/AS8B
|
||||
/wEvAf8BDAH/AQwB/wEBAf8BAQH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB
|
||||
/wEAAf4BAAH/AQAB6gEAAf8BAAGlAQAB/wEsAU0BLAH6A1oBxwFcAmEB1gFkArQB/AFfA/8BLwP/AQwD
|
||||
/wEBA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAAv4B/wEAAuoB/wEAAqUB/wEsAk0B+gNaAccCXAFhAdYC
|
||||
ZAG0AfwCXwL/Ai8C/wIMAv8CAQL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAH+Af8CAAHqAf8CAAGlAf8C
|
||||
LAFNAfoDWgHHA1ABmgOIAfkDxQH/A7IB/wOcAf8DkQH/A44B/wOOAf8DjgH/A44B/wOPAf8DjgH/A4MB
|
||||
/wNgAf8DWgHyA0wBkANQAZoBagGRAWoB+QF8Af8BfAH/AVEB/wFRAf8BHwH/AR8B/wEHAf8BBwH/AQEB
|
||||
/wEBAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAgH/AQIB/wECAf4BAgH/AQAB6wEAAf8BAAGtAQAB
|
||||
/wFaAWsBWgHyA0wBkANQAZoBagKRAfkBfAP/AVED/wEfA/8BBwP/AQED/wEAA/8BAAP/AQAD/wECA/8B
|
||||
AgL+Af8BAALrAf8BAAKtAf8BWgJrAfIDTAGQA1ABmgJqAZEB+QJ8Av8CUQL/Ah8C/wIHAv8CAQL/AgAC
|
||||
/wIAAv8CAAL/AgIC/wICAf4B/wIAAesB/wIAAa0B/wJaAWsB8gNMAZADLwFJA2wB6wOgAf4DxgH/A64B
|
||||
/wOcAf8DkwH/A5AB/wOPAf8DkAH/A5MB/wOTAf8DhQH/A04B/QNgAeADLQFFAy8BSQNsAesBgAHPAYAB
|
||||
/gF/Af8BfwH/AUkB/wFJAf8BHwH/AR8B/wEMAf8BDAH/AQUB/wEFAf8BAwH/AQMB/wEFAf8BBQH/AQoB
|
||||
/wEKAf8BCgH+AQoB/wEBAe0BAQH/ATABtgEwAf0BYAFmAWAB4AMtAUUDLwFJA2wB6wGAAs8B/gF/A/8B
|
||||
SQP/AR8D/wEMA/8BBQP/AQMD/wEFA/8BCgP/AQoC/gH/AQEC7QH/ATACtgH9AWACZgHgAy0BRQMvAUkD
|
||||
bAHrAoABzwH+An8C/wJJAv8CHwL/AgwC/wIFAv8CAwL/AgUC/wIKAv8CCgH+Af8CAQHtAf8CMAG2Af0C
|
||||
YAFmAeADLQFFAwMBBANWAa4DcAH1A9kB/wPLAf8DtwH/A6cB/wOdAf8DmgH/A5wB/wOfAf8DmwH/A4kB
|
||||
/wNoAfADUgGjAwMBBAMDAQQDVgGuAW4BdgFuAfUBqAH/AagB/wGJAf8BiQH/AVwB/wFcAf8BNwH/ATcB
|
||||
/wEiAf8BIgH/ARsB/wEbAf8BHwH/AR8B/wEmAf8BJgH/AR0B/wEdAf8BBQHzAQUB/wFaAWgBWgHwA1IB
|
||||
owMDAQQDAwEEA1YBrgFuAnYB9QGoA/8BiQP/AVwD/wE3A/8BIgP/ARsD/wEfA/8BJgP/AR0D/wEFAvMB
|
||||
/wFaAmgB8ANSAaMDAwEEAwMBBANWAa4CbgF2AfUCqAL/AokC/wJcAv8CNwL/AiIC/wIbAv8CHwL/AiYC
|
||||
/wIdAv8CBQHzAf8CWgFoAfADUgGjAwMBBAQAAxwBJwNdAccDdwH2A68B/gPXAf8DzAH/A8IB/wO7Af8D
|
||||
twH/A7EB/wOAAf4DaAH0A1kBvAMbASYIAAMcAScDXQHHAXIBegFyAfYBhwHPAYcB/gGlAf8BpQH/AYsB
|
||||
/wGLAf8BdAH/AXQB/wFmAf8BZgH/AVwB/wFcAf8BTgH/AU4B/wFIAc8BSAH+AVMBdwFTAfQBVwFZAVcB
|
||||
vAMbASYIAAMcAScDXQHHAXICegH2AYcCzwH+AaUD/wGLA/8BdAP/AWYD/wFcA/8BTgP/AUgCzwH+AVMC
|
||||
dwH0AVcCWQG8AxsBJggAAxwBJwNdAccCcgF6AfYChwHPAf4CpQL/AosC/wJ0Av8CZgL/AlwC/wJOAv8C
|
||||
SAHPAf4CUwF3AfQCVwFZAbwDGwEmDAADIQEwA1kBtgNnAe4DkwH6A74B/QPUAf8DzAH/A74B/QOEAfkD
|
||||
bAHrA1UBrAMfASwQAAMhATADWQG2AWUBaQFlAe4BfQGfAX0B+gGuAb4BrgH9AZ8B/wGfAf8BjAH/AYwB
|
||||
/wFeAb4BXgH9AWgBkQFoAfkBYQFsAWEB6wNVAawDHwEsEAADIQEwA1kBtgFlAmkB7gF9Ap8B+gGuAr4B
|
||||
/QGfA/8BjAP/AV4CvgH9AWgCkQH5AWECbAHrA1UBrAMfASwQAAMhATADWQG2AmUBaQHuAn0BnwH6Aq4B
|
||||
vgH9Ap8C/wKMAv8CXgG+Af0CaAGRAfkCYQFsAesDVQGsAx8BLBQAAwYBBwM2AVgDVQGsA2YB5QOgAfwD
|
||||
kwH7A2UB4gNTAacDMwFRAwYBBxgAAwYBBwM2AVgDVQGsA2YB5QF+AbQBfgH8AW0BngFtAfsDZQHiA1MB
|
||||
pwMzAVEDBgEHGAADBgEHAzYBWANVAawDZgHlAX4CtAH8AW0CngH7A2UB4gNTAacDMwFRAwYBBxgAAwYB
|
||||
BwM2AVgDVQGsA2YB5QJ+AbQB/AJtAZ4B+wNlAeIDUwGnAzMBUQMGAQcMAAFCAU0BPgcAAT4DAAEoAwAB
|
||||
QAMAASADAAEBAQABAQYAAQEWAAP/gQAB4AEHAeABBwHgAQcB4AEHAcABAwHAAQMBwAEDAcABAwGAAQEB
|
||||
gAEBAYABAQGAAQFQAAGAAQEBgAEBAYABAQGAAQEBwAEDAcABAwHAAQMBwAEDAeABBwHgAQcB4AEHAeAB
|
||||
Bws=
|
||||
</value>
|
||||
</data>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
|
||||
21
qtc-net-client-2/Forms/ConnectionClosed.Designer.cs
generated
@ -31,17 +31,18 @@
|
||||
lblHead = new Label();
|
||||
btnReconnect = new Button();
|
||||
btnQuit = new Button();
|
||||
lblReason = new Label();
|
||||
SuspendLayout();
|
||||
//
|
||||
// lblHead
|
||||
//
|
||||
lblHead.AutoSize = true;
|
||||
lblHead.Font = new Font("Segoe UI", 11F, FontStyle.Bold);
|
||||
lblHead.Location = new Point(12, 9);
|
||||
lblHead.Name = "lblHead";
|
||||
lblHead.Size = new Size(444, 20);
|
||||
lblHead.TabIndex = 0;
|
||||
lblHead.Text = "Your Connection To The QtC.NET Server Was Lost. What Now?";
|
||||
lblHead.TextAlign = ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// btnReconnect
|
||||
//
|
||||
@ -65,12 +66,23 @@
|
||||
btnQuit.UseVisualStyleBackColor = true;
|
||||
btnQuit.Click += btnQuit_Click;
|
||||
//
|
||||
// ConnectionClosed
|
||||
// lblReason
|
||||
//
|
||||
lblReason.AutoSize = true;
|
||||
lblReason.Font = new Font("Segoe UI", 5F, FontStyle.Bold);
|
||||
lblReason.Location = new Point(88, 40);
|
||||
lblReason.Name = "lblReason";
|
||||
lblReason.Size = new Size(72, 10);
|
||||
lblReason.TabIndex = 3;
|
||||
lblReason.Text = "Reason: ${REASON}";
|
||||
//
|
||||
// frmConnectionClosed
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(7F, 15F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
BackColor = Color.DodgerBlue;
|
||||
ClientSize = new Size(463, 65);
|
||||
Controls.Add(lblReason);
|
||||
Controls.Add(btnQuit);
|
||||
Controls.Add(btnReconnect);
|
||||
Controls.Add(lblHead);
|
||||
@ -80,10 +92,12 @@
|
||||
Margin = new Padding(4, 3, 4, 3);
|
||||
MaximizeBox = false;
|
||||
MinimizeBox = false;
|
||||
Name = "ConnectionClosed";
|
||||
Name = "frmConnectionClosed";
|
||||
StartPosition = FormStartPosition.CenterScreen;
|
||||
Text = "QtC.NET Client - Connection Lost";
|
||||
Load += frmConnectionClosed_Load;
|
||||
ResumeLayout(false);
|
||||
PerformLayout();
|
||||
}
|
||||
|
||||
#endregion
|
||||
@ -91,5 +105,6 @@
|
||||
private Label lblHead;
|
||||
private Button btnReconnect;
|
||||
private Button btnQuit;
|
||||
private Label lblReason;
|
||||
}
|
||||
}
|
||||
@ -12,12 +12,19 @@ namespace qtc_net_client_2.Forms
|
||||
{
|
||||
public partial class ConnectionClosed : Form
|
||||
{
|
||||
public Label StatusLabel { get { return lblHead; } }
|
||||
public ConnectionClosed()
|
||||
public string? Reason { get; set; } = string.Empty;
|
||||
public ConnectionClosed(string? reason = "")
|
||||
{
|
||||
Reason = reason;
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private void frmConnectionClosed_Load(object sender, EventArgs e)
|
||||
{
|
||||
if (string.IsNullOrEmpty(Reason)) lblReason.Visible = false;
|
||||
else lblReason.Text = $"Reason: {Reason}";
|
||||
}
|
||||
|
||||
private void btnReconnect_Click(object sender, EventArgs e)
|
||||
{
|
||||
DialogResult = DialogResult.OK;
|
||||
|
||||
47
qtc-net-client-2/Forms/DirectMessage.Designer.cs
generated
@ -29,14 +29,23 @@
|
||||
private void InitializeComponent()
|
||||
{
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DirectMessage));
|
||||
rtxtChat = new RichTextBox();
|
||||
btnSend = new Button();
|
||||
rtxtChatbox = new RichTextBox();
|
||||
lblUsername = new Label();
|
||||
pbPfp = new PictureBox();
|
||||
fpnlMessages = new FlowLayoutPanel();
|
||||
((System.ComponentModel.ISupportInitialize)pbPfp).BeginInit();
|
||||
SuspendLayout();
|
||||
//
|
||||
// rtxtChat
|
||||
//
|
||||
rtxtChat.HideSelection = false;
|
||||
rtxtChat.Location = new Point(12, 48);
|
||||
rtxtChat.Margin = new Padding(4, 3, 4, 3);
|
||||
rtxtChat.Name = "rtxtChat";
|
||||
rtxtChat.ReadOnly = true;
|
||||
rtxtChat.Size = new Size(593, 325);
|
||||
rtxtChat.TabIndex = 6;
|
||||
rtxtChat.Text = "";
|
||||
//
|
||||
// btnSend
|
||||
//
|
||||
btnSend.FlatAppearance.BorderSize = 0;
|
||||
@ -65,44 +74,21 @@
|
||||
//
|
||||
lblUsername.AutoSize = true;
|
||||
lblUsername.Font = new Font("Segoe UI", 25F, FontStyle.Bold | FontStyle.Italic);
|
||||
lblUsername.Location = new Point(52, 0);
|
||||
lblUsername.Location = new Point(6, 0);
|
||||
lblUsername.Margin = new Padding(4, 0, 4, 0);
|
||||
lblUsername.Name = "lblUsername";
|
||||
lblUsername.Size = new Size(181, 46);
|
||||
lblUsername.TabIndex = 7;
|
||||
lblUsername.Text = "Username";
|
||||
//
|
||||
// pbPfp
|
||||
//
|
||||
pbPfp.Image = Properties.Resources.DefaultPfp;
|
||||
pbPfp.Location = new Point(14, 6);
|
||||
pbPfp.Name = "pbPfp";
|
||||
pbPfp.Size = new Size(40, 37);
|
||||
pbPfp.SizeMode = PictureBoxSizeMode.StretchImage;
|
||||
pbPfp.TabIndex = 9;
|
||||
pbPfp.TabStop = false;
|
||||
//
|
||||
// fpnlMessages
|
||||
//
|
||||
fpnlMessages.AutoScroll = true;
|
||||
fpnlMessages.BackColor = Color.White;
|
||||
fpnlMessages.BorderStyle = BorderStyle.Fixed3D;
|
||||
fpnlMessages.FlowDirection = FlowDirection.TopDown;
|
||||
fpnlMessages.Location = new Point(14, 49);
|
||||
fpnlMessages.Name = "fpnlMessages";
|
||||
fpnlMessages.Size = new Size(591, 324);
|
||||
fpnlMessages.TabIndex = 11;
|
||||
fpnlMessages.WrapContents = false;
|
||||
//
|
||||
// DirectMessage
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(7F, 15F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
BackColor = Color.DodgerBlue;
|
||||
ClientSize = new Size(618, 443);
|
||||
Controls.Add(fpnlMessages);
|
||||
Controls.Add(pbPfp);
|
||||
Controls.Add(lblUsername);
|
||||
Controls.Add(rtxtChat);
|
||||
Controls.Add(btnSend);
|
||||
Controls.Add(rtxtChatbox);
|
||||
Font = new Font("Segoe UI", 9F);
|
||||
@ -115,16 +101,15 @@
|
||||
StartPosition = FormStartPosition.CenterScreen;
|
||||
Text = "QtC.NET Client - Direct Message With ${USER}";
|
||||
Load += frmDirectMessage_Load;
|
||||
((System.ComponentModel.ISupportInitialize)pbPfp).EndInit();
|
||||
ResumeLayout(false);
|
||||
PerformLayout();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private RichTextBox rtxtChat;
|
||||
private Button btnSend;
|
||||
private RichTextBox rtxtChatbox;
|
||||
private Label lblUsername;
|
||||
private PictureBox pbPfp;
|
||||
private FlowLayoutPanel fpnlMessages;
|
||||
}
|
||||
}
|
||||
@ -1,5 +1,4 @@
|
||||
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||
using qtc_net_client_2.Controls;
|
||||
using qtc_net_client_2.Services;
|
||||
using QtCNETAPI.Dtos.User;
|
||||
using QtCNETAPI.Events;
|
||||
@ -37,23 +36,15 @@ namespace qtc_net_client_2.Forms
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private async void frmDirectMessage_Load(object sender, EventArgs e)
|
||||
private void frmDirectMessage_Load(object sender, EventArgs e)
|
||||
{
|
||||
lblUsername.Text = User.Username;
|
||||
Text = $"QtC.NET Client - Direct Message With {User.Username}";
|
||||
Messages.CollectionChanged += Messages_CollectionChanged;
|
||||
|
||||
var pfpRes = await _apiService.GetUserProfilePic(User.Id);
|
||||
if(pfpRes != null && pfpRes.Success && pfpRes.Data != null)
|
||||
{
|
||||
using var ms = new MemoryStream(pfpRes.Data);
|
||||
using var img = Image.FromStream(ms);
|
||||
pbPfp.Image = new Bitmap(img);
|
||||
}
|
||||
|
||||
if (InitMessage != null)
|
||||
{
|
||||
Messages.Add($"{User.Username}: {InitMessage.Content}");
|
||||
Messages.Add($"[{User.Username}] {InitMessage.Content}\n");
|
||||
AudioService.PlaySoundEffect("sndDirectMsg");
|
||||
}
|
||||
}
|
||||
@ -67,7 +58,7 @@ namespace qtc_net_client_2.Forms
|
||||
if (!string.IsNullOrEmpty(rtxtChatbox.Text))
|
||||
{
|
||||
await _gatewayService.SendDirectMessageAsync(User, new QtCNETAPI.Models.Message { Content = rtxtChatbox.Text, AuthorId = _apiService.CurrentUser.Id });
|
||||
Messages.Add($"{_apiService.CurrentUser.Username}: {rtxtChatbox.Text}");
|
||||
Messages.Add($"[{_apiService.CurrentUser.Username}] {rtxtChatbox.Text}");
|
||||
rtxtChatbox.Clear();
|
||||
AudioService.PlaySoundEffect("sndSendClick");
|
||||
}
|
||||
@ -78,7 +69,7 @@ namespace qtc_net_client_2.Forms
|
||||
if (!string.IsNullOrEmpty(rtxtChatbox.Text))
|
||||
{
|
||||
await _gatewayService.SendDirectMessageAsync(User, new QtCNETAPI.Models.Message { Content = rtxtChatbox.Text, AuthorId = _apiService.CurrentUser.Id });
|
||||
Messages.Add($"{_apiService.CurrentUser.Username}: {rtxtChatbox.Text}");
|
||||
Messages.Add($"[{_apiService.CurrentUser.Username}] {rtxtChatbox.Text}");
|
||||
rtxtChatbox.Clear();
|
||||
AudioService.PlaySoundEffect("sndSendClick");
|
||||
}
|
||||
@ -101,36 +92,14 @@ namespace qtc_net_client_2.Forms
|
||||
Invoke(delegate ()
|
||||
{
|
||||
var msg = e.NewItems.Cast<string>().FirstOrDefault();
|
||||
|
||||
var ctrl = new ChatMessageControlMinimal()
|
||||
{
|
||||
Username = msg!.Split(':')[0],
|
||||
Message = msg!.Split(":")[1].Trim(),
|
||||
};
|
||||
ctrl.Height = ctrl.CalculateHeight(ctrl.Width);
|
||||
|
||||
fpnlMessages.Controls.Add(ctrl);
|
||||
fpnlMessages.VerticalScroll.Value = fpnlMessages.VerticalScroll.Maximum;
|
||||
fpnlMessages.PerformLayout();
|
||||
|
||||
rtxtChat.AppendText(msg);
|
||||
if (!msg!.Contains(_apiService.CurrentUser.Username)) AudioService.PlaySoundEffect("sndMessage");
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
var msg = e.NewItems.Cast<string>().FirstOrDefault();
|
||||
|
||||
var ctrl = new ChatMessageControlMinimal()
|
||||
{
|
||||
Username = msg!.Split(':')[0],
|
||||
Message = msg!.Split(":")[1].Trim(),
|
||||
};
|
||||
ctrl.Height = ctrl.CalculateHeight(ctrl.Width);
|
||||
|
||||
fpnlMessages.Controls.Add(ctrl);
|
||||
fpnlMessages.VerticalScroll.Value = fpnlMessages.VerticalScroll.Maximum;
|
||||
fpnlMessages.PerformLayout();
|
||||
|
||||
rtxtChat.AppendText(msg);
|
||||
if (!msg!.Contains(_apiService.CurrentUser.Username)) AudioService.PlaySoundEffect("sndMessage");
|
||||
}
|
||||
}
|
||||
|
||||
112
qtc-net-client-2/Forms/DonationWindow.Designer.cs
generated
@ -1,112 +0,0 @@
|
||||
namespace qtc_net_client_2.Forms
|
||||
{
|
||||
partial class DonationWindow
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DonationWindow));
|
||||
lblHi = new Label();
|
||||
lblInfo = new Label();
|
||||
pbKofi = new PictureBox();
|
||||
pbCobaltPuter = new PictureBox();
|
||||
((System.ComponentModel.ISupportInitialize)pbKofi).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)pbCobaltPuter).BeginInit();
|
||||
SuspendLayout();
|
||||
//
|
||||
// lblHi
|
||||
//
|
||||
lblHi.AutoSize = true;
|
||||
lblHi.Font = new Font("Segoe UI", 30F, FontStyle.Bold | FontStyle.Italic);
|
||||
lblHi.Location = new Point(231, 7);
|
||||
lblHi.Name = "lblHi";
|
||||
lblHi.Size = new Size(81, 54);
|
||||
lblHi.TabIndex = 0;
|
||||
lblHi.Text = "Hi!";
|
||||
//
|
||||
// lblInfo
|
||||
//
|
||||
lblInfo.Font = new Font("Segoe UI", 7F, FontStyle.Bold);
|
||||
lblInfo.Location = new Point(12, 51);
|
||||
lblInfo.Name = "lblInfo";
|
||||
lblInfo.Size = new Size(290, 177);
|
||||
lblInfo.TabIndex = 1;
|
||||
lblInfo.Text = resources.GetString("lblInfo.Text");
|
||||
lblInfo.TextAlign = ContentAlignment.MiddleLeft;
|
||||
//
|
||||
// pbKofi
|
||||
//
|
||||
pbKofi.Cursor = Cursors.Hand;
|
||||
pbKofi.Image = Properties.Resources.support_me_on_kofi_badge_blue;
|
||||
pbKofi.Location = new Point(89, 239);
|
||||
pbKofi.Name = "pbKofi";
|
||||
pbKofi.Size = new Size(149, 78);
|
||||
pbKofi.SizeMode = PictureBoxSizeMode.Zoom;
|
||||
pbKofi.TabIndex = 2;
|
||||
pbKofi.TabStop = false;
|
||||
pbKofi.Click += pbKofi_Click;
|
||||
//
|
||||
// pbCobaltPuter
|
||||
//
|
||||
pbCobaltPuter.Image = Properties.Resources.cobalt_sittingatputer;
|
||||
pbCobaltPuter.Location = new Point(316, 29);
|
||||
pbCobaltPuter.Name = "pbCobaltPuter";
|
||||
pbCobaltPuter.Size = new Size(339, 270);
|
||||
pbCobaltPuter.SizeMode = PictureBoxSizeMode.Zoom;
|
||||
pbCobaltPuter.TabIndex = 3;
|
||||
pbCobaltPuter.TabStop = false;
|
||||
//
|
||||
// DonationWindow
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(7F, 15F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
BackColor = Color.DodgerBlue;
|
||||
ClientSize = new Size(667, 328);
|
||||
Controls.Add(pbCobaltPuter);
|
||||
Controls.Add(pbKofi);
|
||||
Controls.Add(lblInfo);
|
||||
Controls.Add(lblHi);
|
||||
ForeColor = Color.White;
|
||||
FormBorderStyle = FormBorderStyle.FixedDialog;
|
||||
MaximizeBox = false;
|
||||
MinimizeBox = false;
|
||||
Name = "DonationWindow";
|
||||
StartPosition = FormStartPosition.CenterScreen;
|
||||
Text = "QtC.NET Client - Donate!";
|
||||
((System.ComponentModel.ISupportInitialize)pbKofi).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)pbCobaltPuter).EndInit();
|
||||
ResumeLayout(false);
|
||||
PerformLayout();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private Label lblHi;
|
||||
private Label lblInfo;
|
||||
private PictureBox pbKofi;
|
||||
private PictureBox pbCobaltPuter;
|
||||
}
|
||||
}
|
||||
@ -1,51 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Security.Policy;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace qtc_net_client_2.Forms
|
||||
{
|
||||
public partial class DonationWindow : Form
|
||||
{
|
||||
public DonationWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private void pbKofi_Click(object sender, EventArgs e)
|
||||
{
|
||||
var url = "https://ko-fi.com/moonbase__";
|
||||
try
|
||||
{
|
||||
Process.Start(url);
|
||||
} catch
|
||||
{
|
||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||
{
|
||||
url = url.Replace("&", "^&");
|
||||
Process.Start(new ProcessStartInfo("cmd", $"/c start {url}") { CreateNoWindow = true });
|
||||
}
|
||||
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
|
||||
{
|
||||
Process.Start("xdg-open", url);
|
||||
}
|
||||
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
|
||||
{
|
||||
Process.Start("open", url);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,136 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="lblInfo.Text" xml:space="preserve">
|
||||
<value>I'm Moonbase, Thanks For Using QtC.NET!
|
||||
|
||||
If you wish, you can send a few bucks to my KoFi
|
||||
linked below. It will help imensely in improving the
|
||||
performance of the platform by upgrading the VPS
|
||||
this is currently being hosted on.
|
||||
|
||||
This project is and always will be mostly just a passion
|
||||
project, similar to the likes of SillyPost. The protocol
|
||||
has existed for a bit now, however
|
||||
this is the most I've worked
|
||||
on it.
|
||||
|
||||
Thanks again for your interest!</value>
|
||||
</data>
|
||||
</root>
|
||||
64
qtc-net-client-2/Forms/Login.Designer.cs
generated
@ -32,13 +32,11 @@
|
||||
pbLoginBanner = new PictureBox();
|
||||
tbEmail = new TextBox();
|
||||
lblEmail = new Label();
|
||||
lblPassword = new Label();
|
||||
label1 = new Label();
|
||||
tbPassword = new TextBox();
|
||||
btnLogin = new Button();
|
||||
llblRegister = new LinkLabel();
|
||||
cbRememberMe = new CheckBox();
|
||||
llblResendEmail = new LinkLabel();
|
||||
llblForgotPasswor = new LinkLabel();
|
||||
((System.ComponentModel.ISupportInitialize)pbLoginBanner).BeginInit();
|
||||
SuspendLayout();
|
||||
//
|
||||
@ -70,16 +68,16 @@
|
||||
lblEmail.TabIndex = 2;
|
||||
lblEmail.Text = "Email";
|
||||
//
|
||||
// lblPassword
|
||||
// label1
|
||||
//
|
||||
lblPassword.AutoSize = true;
|
||||
lblPassword.Font = new Font("Segoe UI Light", 9F);
|
||||
lblPassword.ForeColor = SystemColors.ControlLight;
|
||||
lblPassword.Location = new Point(11, 138);
|
||||
lblPassword.Name = "lblPassword";
|
||||
lblPassword.Size = new Size(55, 15);
|
||||
lblPassword.TabIndex = 4;
|
||||
lblPassword.Text = "Password";
|
||||
label1.AutoSize = true;
|
||||
label1.Font = new Font("Segoe UI Light", 9F);
|
||||
label1.ForeColor = SystemColors.ControlLight;
|
||||
label1.Location = new Point(11, 138);
|
||||
label1.Name = "label1";
|
||||
label1.Size = new Size(55, 15);
|
||||
label1.TabIndex = 4;
|
||||
label1.Text = "Password";
|
||||
//
|
||||
// tbPassword
|
||||
//
|
||||
@ -119,49 +117,21 @@
|
||||
cbRememberMe.ForeColor = SystemColors.ControlLight;
|
||||
cbRememberMe.Location = new Point(198, 168);
|
||||
cbRememberMe.Name = "cbRememberMe";
|
||||
cbRememberMe.Size = new Size(163, 19);
|
||||
cbRememberMe.Size = new Size(157, 19);
|
||||
cbRememberMe.TabIndex = 7;
|
||||
cbRememberMe.Text = "Remember Me For 30 Days";
|
||||
cbRememberMe.Text = "Remember Me For 7 Days";
|
||||
cbRememberMe.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// llblResendEmail
|
||||
//
|
||||
llblResendEmail.AutoSize = true;
|
||||
llblResendEmail.Font = new Font("Segoe UI Light", 9F);
|
||||
llblResendEmail.LinkColor = SystemColors.ControlLight;
|
||||
llblResendEmail.Location = new Point(369, 164);
|
||||
llblResendEmail.Name = "llblResendEmail";
|
||||
llblResendEmail.Size = new Size(129, 15);
|
||||
llblResendEmail.TabIndex = 8;
|
||||
llblResendEmail.TabStop = true;
|
||||
llblResendEmail.Text = "Resend Verification Email";
|
||||
llblResendEmail.LinkClicked += llblResendEmail_LinkClicked;
|
||||
//
|
||||
// llblForgotPasswor
|
||||
//
|
||||
llblForgotPasswor.AutoSize = true;
|
||||
llblForgotPasswor.Font = new Font("Segoe UI Light", 9F);
|
||||
llblForgotPasswor.LinkColor = SystemColors.ControlLight;
|
||||
llblForgotPasswor.Location = new Point(401, 181);
|
||||
llblForgotPasswor.Name = "llblForgotPasswor";
|
||||
llblForgotPasswor.Size = new Size(98, 15);
|
||||
llblForgotPasswor.TabIndex = 9;
|
||||
llblForgotPasswor.TabStop = true;
|
||||
llblForgotPasswor.Text = "Forgot Password?";
|
||||
llblForgotPasswor.LinkClicked += llblForgotPasswor_LinkClicked;
|
||||
//
|
||||
// Login
|
||||
// frmLogin
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(7F, 15F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
BackColor = Color.DodgerBlue;
|
||||
ClientSize = new Size(515, 203);
|
||||
Controls.Add(llblForgotPasswor);
|
||||
Controls.Add(llblResendEmail);
|
||||
Controls.Add(cbRememberMe);
|
||||
Controls.Add(llblRegister);
|
||||
Controls.Add(btnLogin);
|
||||
Controls.Add(lblPassword);
|
||||
Controls.Add(label1);
|
||||
Controls.Add(tbPassword);
|
||||
Controls.Add(lblEmail);
|
||||
Controls.Add(tbEmail);
|
||||
@ -169,7 +139,7 @@
|
||||
FormBorderStyle = FormBorderStyle.FixedDialog;
|
||||
Icon = (Icon)resources.GetObject("$this.Icon");
|
||||
MaximizeBox = false;
|
||||
Name = "Login";
|
||||
Name = "frmLogin";
|
||||
StartPosition = FormStartPosition.CenterParent;
|
||||
Text = "QtC.NET Client - Login";
|
||||
Load += frmLogin_Load;
|
||||
@ -183,12 +153,10 @@
|
||||
private PictureBox pbLoginBanner;
|
||||
private TextBox tbEmail;
|
||||
private Label lblEmail;
|
||||
private Label lblPassword;
|
||||
private Label label1;
|
||||
private TextBox tbPassword;
|
||||
private Button btnLogin;
|
||||
private LinkLabel llblRegister;
|
||||
private CheckBox cbRememberMe;
|
||||
private LinkLabel llblResendEmail;
|
||||
private LinkLabel llblForgotPasswor;
|
||||
}
|
||||
}
|
||||
@ -1,5 +1,4 @@
|
||||
using QtCNETAPI.Services.ApiService;
|
||||
using QtCNETAPI.Services;
|
||||
using QtCNETAPI.Dtos.User;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
@ -10,14 +9,12 @@ using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using qtc_net_client_2.Services;
|
||||
|
||||
namespace qtc_net_client_2.Forms
|
||||
{
|
||||
public partial class Login : Form
|
||||
{
|
||||
private IApiService _apiService;
|
||||
private CredentialService _credService = new();
|
||||
public Login(IApiService apiService)
|
||||
{
|
||||
_apiService = apiService;
|
||||
@ -27,14 +24,14 @@ namespace qtc_net_client_2.Forms
|
||||
|
||||
private async void frmLogin_Load(object sender, EventArgs e)
|
||||
{
|
||||
string? accessToken = _credService.GetAccessToken();
|
||||
|
||||
if (accessToken != null)
|
||||
if (File.Exists("./session.token"))
|
||||
{
|
||||
ToggleControls(false, false);
|
||||
|
||||
// try logging in with the token in cred storage
|
||||
var result = await _apiService.RefreshLogin(accessToken);
|
||||
// try logging in with the token in the file
|
||||
string token = File.ReadAllText("./session.token");
|
||||
|
||||
var result = await _apiService.RefreshLogin(token);
|
||||
if (result.Success)
|
||||
{
|
||||
DialogResult = DialogResult.OK;
|
||||
@ -58,9 +55,8 @@ namespace qtc_net_client_2.Forms
|
||||
RememberMe = cbRememberMe.Checked
|
||||
});
|
||||
|
||||
if (result.Success && result.Data != null)
|
||||
if (result.Success)
|
||||
{
|
||||
_credService.SaveAccessToken(_apiService.CurrentUser.Username, result.Data);
|
||||
DialogResult = DialogResult.OK;
|
||||
Close();
|
||||
}
|
||||
@ -72,24 +68,6 @@ namespace qtc_net_client_2.Forms
|
||||
}
|
||||
}
|
||||
|
||||
private void llblRegister_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
|
||||
{
|
||||
Register frmRegister = new Register(_apiService);
|
||||
frmRegister.ShowDialog();
|
||||
}
|
||||
|
||||
private void llblResendEmail_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
|
||||
{
|
||||
ResendVerificationEmail resendVerificationEmail = new ResendVerificationEmail(_apiService);
|
||||
resendVerificationEmail.ShowDialog();
|
||||
}
|
||||
|
||||
private void llblForgotPasswor_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
|
||||
{
|
||||
ResetPassword resetPassword = new ResetPassword(_apiService);
|
||||
resetPassword.ShowDialog();
|
||||
}
|
||||
|
||||
private void ToggleControls(bool enable, bool clearText)
|
||||
{
|
||||
tbEmail.Enabled = enable;
|
||||
@ -103,5 +81,11 @@ namespace qtc_net_client_2.Forms
|
||||
tbPassword.Text = string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
private void llblRegister_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
|
||||
{
|
||||
Register frmRegister = new Register(_apiService);
|
||||
frmRegister.ShowDialog();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
301
qtc-net-client-2/Forms/Main.Designer.cs
generated
@ -30,27 +30,24 @@
|
||||
{
|
||||
components = new System.ComponentModel.Container();
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Main));
|
||||
ListViewItem listViewItem4 = new ListViewItem("Stock Market", 0);
|
||||
ListViewItem listViewItem5 = new ListViewItem("Guess The Number", 1);
|
||||
ListViewItem listViewItem6 = new ListViewItem("Tic-Tac-Toe (Multiplayer)", "Tic-tac-toe.png");
|
||||
ListViewItem listViewItem1 = new ListViewItem("Stock Market", 0);
|
||||
ListViewItem listViewItem2 = new ListViewItem("Guess The Number", 1);
|
||||
tbcMain = new TabControl();
|
||||
tbpContacts = new TabPage();
|
||||
flpContacts = new FlowLayoutPanel();
|
||||
lvContacts = new ListView();
|
||||
ctxmRefresh = new ContextMenuStrip(components);
|
||||
refreshToolStripMenuItem = new ToolStripMenuItem();
|
||||
ilProfilePics = new ImageList(components);
|
||||
tbpRooms = new TabPage();
|
||||
flpRooms = new FlowLayoutPanel();
|
||||
btnAddRoom = new Button();
|
||||
lbRooms = new ListBox();
|
||||
tbpUsers = new TabPage();
|
||||
lvUserDirectory = new ListView();
|
||||
ilStatusIcons = new ImageList(components);
|
||||
tbpGames = new TabPage();
|
||||
lvGames = new ListView();
|
||||
ilGames = new ImageList(components);
|
||||
tbpStore = new TabPage();
|
||||
lvStoreItems = new ListView();
|
||||
ilStoreThumbnails = new ImageList(components);
|
||||
ilTabIcons = new ImageList(components);
|
||||
ilProfilePics = new ImageList(components);
|
||||
ctxmChangeStatus = new ContextMenuStrip(components);
|
||||
onlineToolStripMenuItem = new ToolStripMenuItem();
|
||||
awayToolStripMenuItem = new ToolStripMenuItem();
|
||||
@ -68,34 +65,17 @@
|
||||
llblSignIn = new LinkLabel();
|
||||
lblWelcome = new Label();
|
||||
pbUserPfp = new PictureBox();
|
||||
pbDonate = new PictureBox();
|
||||
ctxmAdminUserList = new ContextMenuStrip(components);
|
||||
refreshToolStripMenuItem1 = new ToolStripMenuItem();
|
||||
toolStripSeparator1 = new ToolStripSeparator();
|
||||
copyUserIDToClipboardToolStripMenuItem = new ToolStripMenuItem();
|
||||
deleteUserToolStripMenuItem = new ToolStripMenuItem();
|
||||
adminDirectMessageToolStripMenuItem = new ToolStripMenuItem();
|
||||
ctxmAdminRoomList = new ContextMenuStrip(components);
|
||||
toolStripMenuItem1 = new ToolStripMenuItem();
|
||||
toolStripSeparator2 = new ToolStripSeparator();
|
||||
addRoomToolStripMenuItem = new ToolStripMenuItem();
|
||||
deleteRoomToolStripMenuItem = new ToolStripMenuItem();
|
||||
lblConnectionLost = new Label();
|
||||
tbcMain.SuspendLayout();
|
||||
tbpContacts.SuspendLayout();
|
||||
ctxmRefresh.SuspendLayout();
|
||||
tbpRooms.SuspendLayout();
|
||||
tbpUsers.SuspendLayout();
|
||||
tbpGames.SuspendLayout();
|
||||
tbpStore.SuspendLayout();
|
||||
ctxmChangeStatus.SuspendLayout();
|
||||
pCurrencyArea.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)pbCurrencyIcon).BeginInit();
|
||||
pCurrentUser.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)pbUserPfp).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)pbDonate).BeginInit();
|
||||
ctxmAdminUserList.SuspendLayout();
|
||||
ctxmAdminRoomList.SuspendLayout();
|
||||
SuspendLayout();
|
||||
//
|
||||
// tbcMain
|
||||
@ -105,41 +85,41 @@
|
||||
tbcMain.Controls.Add(tbpRooms);
|
||||
tbcMain.Controls.Add(tbpUsers);
|
||||
tbcMain.Controls.Add(tbpGames);
|
||||
tbcMain.Controls.Add(tbpStore);
|
||||
tbcMain.Enabled = false;
|
||||
tbcMain.ImageList = ilTabIcons;
|
||||
tbcMain.Location = new Point(12, 83);
|
||||
tbcMain.Location = new Point(12, 66);
|
||||
tbcMain.Name = "tbcMain";
|
||||
tbcMain.SelectedIndex = 0;
|
||||
tbcMain.Size = new Size(352, 499);
|
||||
tbcMain.Size = new Size(305, 535);
|
||||
tbcMain.TabIndex = 0;
|
||||
tbcMain.SelectedIndexChanged += tbcMain_SelectedIndexChanged;
|
||||
//
|
||||
// tbpContacts
|
||||
//
|
||||
tbpContacts.Controls.Add(flpContacts);
|
||||
tbpContacts.Controls.Add(lvContacts);
|
||||
tbpContacts.ImageKey = "ContactsIcon.png";
|
||||
tbpContacts.Location = new Point(4, 24);
|
||||
tbpContacts.Name = "tbpContacts";
|
||||
tbpContacts.Padding = new Padding(3);
|
||||
tbpContacts.Size = new Size(344, 471);
|
||||
tbpContacts.Size = new Size(297, 507);
|
||||
tbpContacts.TabIndex = 0;
|
||||
tbpContacts.Text = "Contacts";
|
||||
tbpContacts.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// flpContacts
|
||||
// lvContacts
|
||||
//
|
||||
flpContacts.AutoScroll = true;
|
||||
flpContacts.BackColor = Color.White;
|
||||
flpContacts.BorderStyle = BorderStyle.Fixed3D;
|
||||
flpContacts.ContextMenuStrip = ctxmRefresh;
|
||||
flpContacts.Dock = DockStyle.Fill;
|
||||
flpContacts.FlowDirection = FlowDirection.TopDown;
|
||||
flpContacts.Location = new Point(3, 3);
|
||||
flpContacts.Name = "flpContacts";
|
||||
flpContacts.Size = new Size(338, 465);
|
||||
flpContacts.TabIndex = 0;
|
||||
flpContacts.WrapContents = false;
|
||||
lvContacts.Alignment = ListViewAlignment.Left;
|
||||
lvContacts.Anchor = AnchorStyles.Left | AnchorStyles.Right;
|
||||
lvContacts.ContextMenuStrip = ctxmRefresh;
|
||||
lvContacts.LargeImageList = ilProfilePics;
|
||||
lvContacts.Location = new Point(0, 0);
|
||||
lvContacts.MultiSelect = false;
|
||||
lvContacts.Name = "lvContacts";
|
||||
lvContacts.Size = new Size(297, 514);
|
||||
lvContacts.SmallImageList = ilProfilePics;
|
||||
lvContacts.TabIndex = 1;
|
||||
lvContacts.UseCompatibleStateImageBehavior = false;
|
||||
lvContacts.View = View.SmallIcon;
|
||||
lvContacts.DoubleClick += lvContacts_DoubleClick;
|
||||
//
|
||||
// ctxmRefresh
|
||||
//
|
||||
@ -154,31 +134,48 @@
|
||||
refreshToolStripMenuItem.Text = "Refresh";
|
||||
refreshToolStripMenuItem.Click += refreshToolStripMenuItem_Click;
|
||||
//
|
||||
// ilProfilePics
|
||||
//
|
||||
ilProfilePics.ColorDepth = ColorDepth.Depth32Bit;
|
||||
ilProfilePics.ImageStream = (ImageListStreamer)resources.GetObject("ilProfilePics.ImageStream");
|
||||
ilProfilePics.TransparentColor = Color.Transparent;
|
||||
ilProfilePics.Images.SetKeyName(0, "DEFAULT");
|
||||
//
|
||||
// tbpRooms
|
||||
//
|
||||
tbpRooms.Controls.Add(flpRooms);
|
||||
tbpRooms.Controls.Add(btnAddRoom);
|
||||
tbpRooms.Controls.Add(lbRooms);
|
||||
tbpRooms.ImageKey = "RoomsChatIcon.png";
|
||||
tbpRooms.Location = new Point(4, 24);
|
||||
tbpRooms.Name = "tbpRooms";
|
||||
tbpRooms.Padding = new Padding(3);
|
||||
tbpRooms.Size = new Size(344, 471);
|
||||
tbpRooms.Size = new Size(297, 507);
|
||||
tbpRooms.TabIndex = 1;
|
||||
tbpRooms.Text = "Rooms";
|
||||
tbpRooms.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// flpRooms
|
||||
// btnAddRoom
|
||||
//
|
||||
flpRooms.AutoScroll = true;
|
||||
flpRooms.BackColor = Color.White;
|
||||
flpRooms.BorderStyle = BorderStyle.Fixed3D;
|
||||
flpRooms.ContextMenuStrip = ctxmRefresh;
|
||||
flpRooms.Dock = DockStyle.Fill;
|
||||
flpRooms.FlowDirection = FlowDirection.TopDown;
|
||||
flpRooms.Location = new Point(3, 3);
|
||||
flpRooms.Name = "flpRooms";
|
||||
flpRooms.Size = new Size(338, 465);
|
||||
flpRooms.TabIndex = 1;
|
||||
flpRooms.WrapContents = false;
|
||||
btnAddRoom.FlatAppearance.BorderSize = 0;
|
||||
btnAddRoom.FlatStyle = FlatStyle.Flat;
|
||||
btnAddRoom.Location = new Point(342, 485);
|
||||
btnAddRoom.Name = "btnAddRoom";
|
||||
btnAddRoom.Size = new Size(20, 22);
|
||||
btnAddRoom.TabIndex = 7;
|
||||
btnAddRoom.UseVisualStyleBackColor = true;
|
||||
btnAddRoom.Click += btnAddRoom_Click;
|
||||
//
|
||||
// lbRooms
|
||||
//
|
||||
lbRooms.Anchor = AnchorStyles.Left | AnchorStyles.Right;
|
||||
lbRooms.ContextMenuStrip = ctxmRefresh;
|
||||
lbRooms.FormattingEnabled = true;
|
||||
lbRooms.ItemHeight = 15;
|
||||
lbRooms.Location = new Point(0, 0);
|
||||
lbRooms.Name = "lbRooms";
|
||||
lbRooms.Size = new Size(297, 514);
|
||||
lbRooms.TabIndex = 0;
|
||||
lbRooms.DoubleClick += lbRooms_DoubleClick;
|
||||
//
|
||||
// tbpUsers
|
||||
//
|
||||
@ -186,7 +183,7 @@
|
||||
tbpUsers.ImageIndex = 1;
|
||||
tbpUsers.Location = new Point(4, 24);
|
||||
tbpUsers.Name = "tbpUsers";
|
||||
tbpUsers.Size = new Size(344, 471);
|
||||
tbpUsers.Size = new Size(297, 507);
|
||||
tbpUsers.TabIndex = 3;
|
||||
tbpUsers.Text = "Users";
|
||||
tbpUsers.UseVisualStyleBackColor = true;
|
||||
@ -194,13 +191,12 @@
|
||||
// lvUserDirectory
|
||||
//
|
||||
lvUserDirectory.Alignment = ListViewAlignment.Left;
|
||||
lvUserDirectory.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
|
||||
lvUserDirectory.ContextMenuStrip = ctxmRefresh;
|
||||
lvUserDirectory.Location = new Point(0, 0);
|
||||
lvUserDirectory.MultiSelect = false;
|
||||
lvUserDirectory.Name = "lvUserDirectory";
|
||||
lvUserDirectory.RightToLeft = RightToLeft.Yes;
|
||||
lvUserDirectory.Size = new Size(344, 484);
|
||||
lvUserDirectory.Size = new Size(297, 514);
|
||||
lvUserDirectory.SmallImageList = ilStatusIcons;
|
||||
lvUserDirectory.TabIndex = 0;
|
||||
lvUserDirectory.UseCompatibleStateImageBehavior = false;
|
||||
@ -223,23 +219,22 @@
|
||||
tbpGames.ImageIndex = 3;
|
||||
tbpGames.Location = new Point(4, 24);
|
||||
tbpGames.Name = "tbpGames";
|
||||
tbpGames.Size = new Size(344, 471);
|
||||
tbpGames.Size = new Size(297, 507);
|
||||
tbpGames.TabIndex = 4;
|
||||
tbpGames.Text = "Games";
|
||||
tbpGames.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// lvGames
|
||||
//
|
||||
lvGames.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
|
||||
listViewItem4.Tag = "StockMarketGame";
|
||||
listViewItem5.Tag = "GuessTheNumberGame";
|
||||
listViewItem6.Tag = "TicTacToeGame";
|
||||
lvGames.Items.AddRange(new ListViewItem[] { listViewItem4, listViewItem5, listViewItem6 });
|
||||
lvGames.Anchor = AnchorStyles.Left | AnchorStyles.Right;
|
||||
listViewItem1.Tag = "StockMarketGame";
|
||||
listViewItem2.Tag = "GuessTheNumberGame";
|
||||
lvGames.Items.AddRange(new ListViewItem[] { listViewItem1, listViewItem2 });
|
||||
lvGames.LargeImageList = ilGames;
|
||||
lvGames.Location = new Point(0, 0);
|
||||
lvGames.MultiSelect = false;
|
||||
lvGames.Name = "lvGames";
|
||||
lvGames.Size = new Size(344, 484);
|
||||
lvGames.Size = new Size(297, 514);
|
||||
lvGames.SmallImageList = ilGames;
|
||||
lvGames.TabIndex = 2;
|
||||
lvGames.UseCompatibleStateImageBehavior = false;
|
||||
@ -252,37 +247,6 @@
|
||||
ilGames.TransparentColor = Color.Transparent;
|
||||
ilGames.Images.SetKeyName(0, "dollar-money.gif");
|
||||
ilGames.Images.SetKeyName(1, "NumberGuessGameIcon.png");
|
||||
ilGames.Images.SetKeyName(2, "Tic-tac-toe.png");
|
||||
//
|
||||
// tbpStore
|
||||
//
|
||||
tbpStore.Controls.Add(lvStoreItems);
|
||||
tbpStore.ImageIndex = 3;
|
||||
tbpStore.Location = new Point(4, 24);
|
||||
tbpStore.Name = "tbpStore";
|
||||
tbpStore.Padding = new Padding(3);
|
||||
tbpStore.Size = new Size(344, 471);
|
||||
tbpStore.TabIndex = 5;
|
||||
tbpStore.Text = "Store";
|
||||
tbpStore.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// lvStoreItems
|
||||
//
|
||||
lvStoreItems.LargeImageList = ilStoreThumbnails;
|
||||
lvStoreItems.Location = new Point(0, 0);
|
||||
lvStoreItems.MultiSelect = false;
|
||||
lvStoreItems.Name = "lvStoreItems";
|
||||
lvStoreItems.Size = new Size(344, 484);
|
||||
lvStoreItems.SmallImageList = ilStoreThumbnails;
|
||||
lvStoreItems.TabIndex = 0;
|
||||
lvStoreItems.UseCompatibleStateImageBehavior = false;
|
||||
lvStoreItems.DoubleClick += lvStoreItems_DoubleClick;
|
||||
//
|
||||
// ilStoreThumbnails
|
||||
//
|
||||
ilStoreThumbnails.ColorDepth = ColorDepth.Depth32Bit;
|
||||
ilStoreThumbnails.ImageSize = new Size(64, 64);
|
||||
ilStoreThumbnails.TransparentColor = Color.Transparent;
|
||||
//
|
||||
// ilTabIcons
|
||||
//
|
||||
@ -294,13 +258,6 @@
|
||||
ilTabIcons.Images.SetKeyName(2, "RoomsChatIcon.png");
|
||||
ilTabIcons.Images.SetKeyName(3, "CurrencyIcon.png");
|
||||
//
|
||||
// ilProfilePics
|
||||
//
|
||||
ilProfilePics.ColorDepth = ColorDepth.Depth32Bit;
|
||||
ilProfilePics.ImageStream = (ImageListStreamer)resources.GetObject("ilProfilePics.ImageStream");
|
||||
ilProfilePics.TransparentColor = Color.Transparent;
|
||||
ilProfilePics.Images.SetKeyName(0, "DEFAULT");
|
||||
//
|
||||
// ctxmChangeStatus
|
||||
//
|
||||
ctxmChangeStatus.Items.AddRange(new ToolStripItem[] { onlineToolStripMenuItem, awayToolStripMenuItem, doNotDisturbToolStripMenuItem, invisibleToolStripMenuItem });
|
||||
@ -338,10 +295,10 @@
|
||||
//
|
||||
// lblRequestNotif
|
||||
//
|
||||
lblRequestNotif.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
|
||||
lblRequestNotif.Anchor = AnchorStyles.Top | AnchorStyles.Right;
|
||||
lblRequestNotif.AutoSize = true;
|
||||
lblRequestNotif.Font = new Font("Segoe UI", 6F, FontStyle.Bold);
|
||||
lblRequestNotif.Location = new Point(12, 67);
|
||||
lblRequestNotif.Location = new Point(215, 53);
|
||||
lblRequestNotif.Name = "lblRequestNotif";
|
||||
lblRequestNotif.Size = new Size(109, 11);
|
||||
lblRequestNotif.TabIndex = 6;
|
||||
@ -374,7 +331,7 @@
|
||||
pCurrencyArea.Controls.Add(llblClaimSpin);
|
||||
pCurrencyArea.Controls.Add(pbCurrencyIcon);
|
||||
pCurrencyArea.Controls.Add(lblCurrencyAmount);
|
||||
pCurrencyArea.Location = new Point(270, 5);
|
||||
pCurrencyArea.Location = new Point(223, 5);
|
||||
pCurrencyArea.Name = "pCurrencyArea";
|
||||
pCurrencyArea.Size = new Size(95, 46);
|
||||
pCurrencyArea.TabIndex = 12;
|
||||
@ -470,6 +427,7 @@
|
||||
//
|
||||
// pbUserPfp
|
||||
//
|
||||
pbUserPfp.BorderStyle = BorderStyle.FixedSingle;
|
||||
pbUserPfp.ContextMenuStrip = ctxmChangeStatus;
|
||||
pbUserPfp.Cursor = Cursors.Hand;
|
||||
pbUserPfp.Image = Properties.Resources.DefaultPfp;
|
||||
@ -481,114 +439,16 @@
|
||||
pbUserPfp.TabStop = false;
|
||||
pbUserPfp.Click += pbUserPfp_Click;
|
||||
//
|
||||
// pbDonate
|
||||
//
|
||||
pbDonate.Anchor = AnchorStyles.Top | AnchorStyles.Right;
|
||||
pbDonate.Cursor = Cursors.Hand;
|
||||
pbDonate.Image = Properties.Resources.donatebtn;
|
||||
pbDonate.Location = new Point(288, 56);
|
||||
pbDonate.Name = "pbDonate";
|
||||
pbDonate.Size = new Size(77, 22);
|
||||
pbDonate.SizeMode = PictureBoxSizeMode.Zoom;
|
||||
pbDonate.TabIndex = 14;
|
||||
pbDonate.TabStop = false;
|
||||
pbDonate.Click += pbDonate_Click;
|
||||
//
|
||||
// ctxmAdminUserList
|
||||
//
|
||||
ctxmAdminUserList.Items.AddRange(new ToolStripItem[] { refreshToolStripMenuItem1, toolStripSeparator1, copyUserIDToClipboardToolStripMenuItem, deleteUserToolStripMenuItem, adminDirectMessageToolStripMenuItem });
|
||||
ctxmAdminUserList.Name = "contextMenuStrip1";
|
||||
ctxmAdminUserList.Size = new Size(214, 98);
|
||||
ctxmAdminUserList.Opening += ctxmAdminUserList_Opening;
|
||||
//
|
||||
// refreshToolStripMenuItem1
|
||||
//
|
||||
refreshToolStripMenuItem1.Name = "refreshToolStripMenuItem1";
|
||||
refreshToolStripMenuItem1.Size = new Size(213, 22);
|
||||
refreshToolStripMenuItem1.Text = "Refresh";
|
||||
refreshToolStripMenuItem1.Click += refreshToolStripMenuItem_Click;
|
||||
//
|
||||
// toolStripSeparator1
|
||||
//
|
||||
toolStripSeparator1.Name = "toolStripSeparator1";
|
||||
toolStripSeparator1.Size = new Size(210, 6);
|
||||
//
|
||||
// copyUserIDToClipboardToolStripMenuItem
|
||||
//
|
||||
copyUserIDToClipboardToolStripMenuItem.Name = "copyUserIDToClipboardToolStripMenuItem";
|
||||
copyUserIDToClipboardToolStripMenuItem.Size = new Size(213, 22);
|
||||
copyUserIDToClipboardToolStripMenuItem.Text = "Copy User ID To Clipboard";
|
||||
copyUserIDToClipboardToolStripMenuItem.Click += copyUserIDToClipboardToolStripMenuItem_Click;
|
||||
//
|
||||
// deleteUserToolStripMenuItem
|
||||
//
|
||||
deleteUserToolStripMenuItem.Name = "deleteUserToolStripMenuItem";
|
||||
deleteUserToolStripMenuItem.Size = new Size(213, 22);
|
||||
deleteUserToolStripMenuItem.Text = "Delete User";
|
||||
deleteUserToolStripMenuItem.Click += deleteUserToolStripMenuItem_Click;
|
||||
//
|
||||
// adminDirectMessageToolStripMenuItem
|
||||
//
|
||||
adminDirectMessageToolStripMenuItem.Name = "adminDirectMessageToolStripMenuItem";
|
||||
adminDirectMessageToolStripMenuItem.Size = new Size(213, 22);
|
||||
adminDirectMessageToolStripMenuItem.Text = "Admin Direct Message";
|
||||
adminDirectMessageToolStripMenuItem.Click += adminDirectMessageToolStripMenuItem_Click;
|
||||
//
|
||||
// ctxmAdminRoomList
|
||||
//
|
||||
ctxmAdminRoomList.Items.AddRange(new ToolStripItem[] { toolStripMenuItem1, toolStripSeparator2, addRoomToolStripMenuItem, deleteRoomToolStripMenuItem });
|
||||
ctxmAdminRoomList.Name = "contextMenuStrip1";
|
||||
ctxmAdminRoomList.Size = new Size(143, 76);
|
||||
//
|
||||
// toolStripMenuItem1
|
||||
//
|
||||
toolStripMenuItem1.Name = "toolStripMenuItem1";
|
||||
toolStripMenuItem1.Size = new Size(142, 22);
|
||||
toolStripMenuItem1.Text = "Refresh";
|
||||
toolStripMenuItem1.Click += refreshToolStripMenuItem_Click;
|
||||
//
|
||||
// toolStripSeparator2
|
||||
//
|
||||
toolStripSeparator2.Name = "toolStripSeparator2";
|
||||
toolStripSeparator2.Size = new Size(139, 6);
|
||||
//
|
||||
// addRoomToolStripMenuItem
|
||||
//
|
||||
addRoomToolStripMenuItem.Name = "addRoomToolStripMenuItem";
|
||||
addRoomToolStripMenuItem.Size = new Size(142, 22);
|
||||
addRoomToolStripMenuItem.Text = "Add Room";
|
||||
addRoomToolStripMenuItem.Click += addRoomToolStripMenuItem_Click;
|
||||
//
|
||||
// deleteRoomToolStripMenuItem
|
||||
//
|
||||
deleteRoomToolStripMenuItem.Name = "deleteRoomToolStripMenuItem";
|
||||
deleteRoomToolStripMenuItem.Size = new Size(142, 22);
|
||||
deleteRoomToolStripMenuItem.Text = "Delete Room";
|
||||
//
|
||||
// lblConnectionLost
|
||||
//
|
||||
lblConnectionLost.AutoSize = true;
|
||||
lblConnectionLost.Font = new Font("Segoe UI", 6F, FontStyle.Bold);
|
||||
lblConnectionLost.ForeColor = Color.Red;
|
||||
lblConnectionLost.Location = new Point(12, 67);
|
||||
lblConnectionLost.Name = "lblConnectionLost";
|
||||
lblConnectionLost.Size = new Size(175, 11);
|
||||
lblConnectionLost.TabIndex = 15;
|
||||
lblConnectionLost.Text = "Server Connection Lost. Trying To Reconnect...";
|
||||
lblConnectionLost.Visible = false;
|
||||
//
|
||||
// Main
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(7F, 15F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
BackColor = Color.DodgerBlue;
|
||||
ClientSize = new Size(376, 594);
|
||||
Controls.Add(pbDonate);
|
||||
ClientSize = new Size(329, 613);
|
||||
Controls.Add(pCurrentUser);
|
||||
Controls.Add(pCurrencyArea);
|
||||
Controls.Add(lblRequestNotif);
|
||||
Controls.Add(tbcMain);
|
||||
Controls.Add(lblConnectionLost);
|
||||
FormBorderStyle = FormBorderStyle.FixedDialog;
|
||||
Icon = (Icon)resources.GetObject("$this.Icon");
|
||||
MaximizeBox = false;
|
||||
@ -604,7 +464,6 @@
|
||||
tbpRooms.ResumeLayout(false);
|
||||
tbpUsers.ResumeLayout(false);
|
||||
tbpGames.ResumeLayout(false);
|
||||
tbpStore.ResumeLayout(false);
|
||||
ctxmChangeStatus.ResumeLayout(false);
|
||||
pCurrencyArea.ResumeLayout(false);
|
||||
pCurrencyArea.PerformLayout();
|
||||
@ -612,9 +471,6 @@
|
||||
pCurrentUser.ResumeLayout(false);
|
||||
pCurrentUser.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)pbUserPfp).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)pbDonate).EndInit();
|
||||
ctxmAdminUserList.ResumeLayout(false);
|
||||
ctxmAdminRoomList.ResumeLayout(false);
|
||||
ResumeLayout(false);
|
||||
PerformLayout();
|
||||
}
|
||||
@ -624,7 +480,9 @@
|
||||
private TabControl tbcMain;
|
||||
private TabPage tbpContacts;
|
||||
private TabPage tbpRooms;
|
||||
private ListBox lbRooms;
|
||||
private Label lblRequestNotif;
|
||||
private ListView lvContacts;
|
||||
private System.Windows.Forms.ImageList ilProfilePics;
|
||||
private NotifyIcon niMain;
|
||||
private ImageList ilTabIcons;
|
||||
@ -633,6 +491,7 @@
|
||||
private ToolStripMenuItem awayToolStripMenuItem;
|
||||
private ToolStripMenuItem doNotDisturbToolStripMenuItem;
|
||||
private ToolStripMenuItem invisibleToolStripMenuItem;
|
||||
private Button btnAddRoom;
|
||||
private LinkLabel llblClaimSpin;
|
||||
private Panel pCurrencyArea;
|
||||
private Panel pCurrentUser;
|
||||
@ -650,24 +509,6 @@
|
||||
private ToolStripMenuItem refreshToolStripMenuItem;
|
||||
private ImageList ilStatusIcons;
|
||||
private TabPage tbpUsers;
|
||||
private PictureBox pbDonate;
|
||||
private TabPage tbpStore;
|
||||
private ListView lvStoreItems;
|
||||
private ImageList ilStoreThumbnails;
|
||||
private ContextMenuStrip ctxmAdminUserList;
|
||||
private ToolStripMenuItem refreshToolStripMenuItem1;
|
||||
private ToolStripSeparator toolStripSeparator1;
|
||||
private ToolStripMenuItem copyUserIDToClipboardToolStripMenuItem;
|
||||
private ToolStripMenuItem deleteUserToolStripMenuItem;
|
||||
private ToolStripMenuItem adminDirectMessageToolStripMenuItem;
|
||||
private ContextMenuStrip ctxmAdminRoomList;
|
||||
private ToolStripMenuItem toolStripMenuItem1;
|
||||
private ToolStripSeparator toolStripSeparator2;
|
||||
private ToolStripMenuItem addRoomToolStripMenuItem;
|
||||
private ToolStripMenuItem deleteRoomToolStripMenuItem;
|
||||
private Label lblConnectionLost;
|
||||
private FlowLayoutPanel flpContacts;
|
||||
private ListView lvUserDirectory;
|
||||
private FlowLayoutPanel flpRooms;
|
||||
}
|
||||
}
|
||||
|
||||
@ -120,362 +120,6 @@
|
||||
<metadata name="ctxmRefresh.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>356, 21</value>
|
||||
</metadata>
|
||||
<metadata name="ilTabIcons.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>20, 44</value>
|
||||
</metadata>
|
||||
<data name="ilTabIcons.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>
|
||||
AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs
|
||||
LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu
|
||||
SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAshIAAAJNU0Z0AUkBTAIBAQQB
|
||||
AAGoAQMBqAEDARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMAASADAAEBAQABIAYAASD/
|
||||
AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/ACIAA2cB7wJnAVkB7wFnAV0BWQHvAWcBWwFZAe8B
|
||||
ZwFbAVkB7wFnAlkB7wFnAWQBWQHvA2cB7wNnAe8DZwHvA2cB7wNnAe8DZwHvA2cB7wNnAe8DZwHvAwcB
|
||||
CQMqAT8DRQF8A1kBuwNjAd8DaAH0A4AB/gOBAf8DgQH/A4EB/wOAAf4DaAH0A2MB3wNaAboDRAF6AycB
|
||||
OjgAAzMBUQNuAfUIAAM3AVoDWAG4A2MB3wJjAV0B3wFiAl0B3wNdAd8DXQHfAWECXQHfA2MB3wNjAd8D
|
||||
VQGsAzABSwgAA/gB/wG5AZUBPAH/AYMBfQFuAf8BhAF9AWwB/wGqAYQBJwH/AawBewEAAf8BzAG8AZQB
|
||||
/wN+Af8DfgH/A34B/wN+Af8DfgH/A34B/wN+Af8DfgH/A44B/wNDAXUDXQHMA3wB+AOBAf8DgQH/A4EB
|
||||
/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A3wB+ANUAag4AAMSARgDPwFtBAADOwFiA10B
|
||||
xQNoAfQBnwFlATEB/wGXAVMBFwH/AZYBSwEJAf8BkwFGAQEB/wGMAUMBAwH/AX0BQAELAf8BawFAARoB
|
||||
/wFuAVABNgH/A2gB8ANaAbcDNAFUBAAE/wGXAYsBbQH/AoEBgAH/AYIBgQGAAf8BmAGIAWAB/wHKAZAB
|
||||
AAH/Ad0BzAGfAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOTAf8DagHtA30B+gOBAf8D
|
||||
gQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DVQGvNAADXwHTAz0B
|
||||
ZwQAAzUBVQNdAccCbgFaAfUBuAFlARsB/wG5AVgBAgH/AckBXwEAAf8B2AFlAQAB/wHcAWcBAAH/AdYB
|
||||
ZAEAAf8BwwFcAQAB/wGiAUwBAAH/AXwBOwEDAf8BbgFGASMB/wNoAfADWgG3AzABSgT/AYYBhAF9Af8D
|
||||
gQH/A4EB/wGHAYMBegH/Ac8BlAEAAf8B3gHMAZ8B/wPgAf8D4AH/A+AB/wPgAf8D4AH/A+AB/wPgAf8D
|
||||
4AH/A7wB/wNjAd8DbgH1A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8D
|
||||
gQH/A4EB/wNVAa80AANaAcIDNAFTBAADXAHEAnwBXAH4AdQBcQEYAf8B1wFlAQAB/wHlAWwBAAH/AfIB
|
||||
cgEAAf8B+gF1AQAB/wH8AXYBAAH/AfoBdgEAAf8B8wFyAQAB/wHiAWsBAAH/Ab0BWQEAAf8BhwFAAQAB
|
||||
/wFxAUgBIwH/A2gB8ANWAasE/wGLAYYBegH/A4EB/wOBAf8BjgGGAXEB/wHPAZQBAAH/Ad4BzAGfIf8D
|
||||
ygH/AzYBWANbAcADbgH1A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8D
|
||||
aAH0A1IBpBAAAw0BEQM/AWwDUwGnAVwCWQG+AVgCVgGzAUgCRwGDAyEBMAQAA28B8wM6AWAIAAH+Ad0B
|
||||
wQH/Ae0BgAEgAf8B7QFxAQIB/wHzAXMBAAH/AfoBdgEAAf8B/gF4AQAC/wF7AQgC/wGIAScC/wGiAVMB
|
||||
/wH+AYEBFwH/AfwBeAEEAf8B7AFvAQAB/wHBAVsBAAH/AYYBQQEDAf8BeAFWATYB/wNjAd8E/wGsAZYB
|
||||
YAH/AYMBggF/Af8BhQGCAX0B/wGzAZMBRAH/Ac8BlAEAAf8B3gHMAZ8B/wOwAf8DsAH/A7AB/wOwAf8D
|
||||
sAH/A7AB/wOwAf8DsAH/A6gB/wMCAQMDGgEjAzgBXANUAagDYgHXA3AB8QOAAf4DgQH/A4EB/wOBAf8D
|
||||
gQH9A2gB8ANhAdQDUwGlAzYBWQMYASAIAAMaASQDUgGgAmMBSAH2AaIBcwEAAf8BrgF8AQAB/wGwAX0B
|
||||
AAH/AagBeAEAAf8BlQFqAQAB/wKAAXUB/gFcAlkBxgNXAbUDFgEeCAAB/wGyAW8B/wH9AYABEQH/AfwB
|
||||
dwEBAf8B/QF3AQAC/wF4AQAC/wF/AQ8C/wGSATsC/wGzAYMC/wHqAeAC/wGQAT0C/wF7AQoB/wH8AXcB
|
||||
AAH/AeUBbAEAAf8BsQFUAQAB/wGEAUsBGgH/A2MB3wT/AdkBqgE3Af8BvgGYATgB/wHAAZgBNgH/AdwB
|
||||
ogEUAf8BzwGUAQAB/wHeAcwBnwH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DkwH/RAAD
|
||||
IAEtAmMBWgHpAb8BiAEAAf8BzQGVAQoB/wGwAYgBJwH/AXMBZAE/Af8BTQFLAUcB/wFOAUsBQgH/AWYB
|
||||
VwExAf8BmgF0ARcB/wGkAXYBAwH/AXABTwEAAf8DQwF2BAEEAAH/AZoBQgL/AYMBFQH/Af4BegEEAv8B
|
||||
eAEAAv8BeAEAAv8BlQE/Av8BygGuAv8B2gHGAv8B7QHlAv8BlgFJAv8BfAENAf8B/gF4AQAB/wH0AXMB
|
||||
AAH/AdABYgEAAf8BmgFOAQoB/wFjAl0B3wT/AeEBrgExAf8BvQGXATsB/wHAAZgBNQH/AeMBpQEKAf8B
|
||||
zwGUAQAB/wHeAcwBnwH/A8AB/wPAAf8DwAH/A8AB/wPAAf8DwAH/A8AB/wPAAf8DrwH/CAADAgEDAwgB
|
||||
CgMhAS8DMQFOAz0BaANDAXYDRAF6A0MBdQM9AWcDMQFNAyABLgMHAQkEAggAAmMBWgHpAdkBmgEAAf8B
|
||||
2gGjARwB/wKOAYwB/wOKAf8DlwH/A5sB/wORAf8DdAH/A0gB/wFDAUIBPwH/AbUBgwEHAf8BegFXAQAB
|
||||
/wM2AVgEAAH/AZUBNwL/AYkBHwL/AX0BCAL/AXgBAAL/AXgBAAL/AagBXAL/AeABzQL/AaEBZgL/AdgB
|
||||
xQL/AbkBlAL/AYcBIwL/AXgBAAH/AfsBdgEAAf8B4gFqAQAB/wGvAVQBAwH/AWMCXQHfBP8BuwGdAVMB
|
||||
/wGIAYQBeQH/AYwBhQF0Af8BxAGZATAB/wHPAZQBAAH/Ad4BzAGfIf8DygH/BAADEwEaAzkBXQNZAbwD
|
||||
ZAHbA2oB7QNjAfYDXwH7A4EB/QNfAfsDYwH2A2UB7ANjAdoDWgG6AzgBXAMTARoDQwF2AekBpwECAf8B
|
||||
6QGrARIB/wHQAcoBuwH/A6wB/wNdAf8DTAH/A0sB/wNEAf8DDwH/A7MB/wNmAf8BVAFMAToB/wGuAX0B
|
||||
BAH/A10BzAQAAf8BoAFJAv8BkgExAv8BgQERAv8BeQEDAv8BeAEAAv8BqAFcAv8B4AHNAv8BoQFmAv8B
|
||||
2AHFAv8BwAGfAv8BiQEnAv8BeAEAAf8B/gF4AQAB/wHsAW8BAAH/Ab8BWgECAf8BYwJdAd8E/wGUAYoB
|
||||
cwH/A4EB/wOBAf8BmgGKAWMB/wHPAZQBAAH/Ad4BzAGfAf8D0AH/A9AB/wPQAf8D0AH/A9AB/wPQAf8D
|
||||
0AH/A9AB/wO1Af8DGgEkA1YBrgNoAfQDgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8D
|
||||
gQH/A4EB/wNrAfIDUgGhAmoBYQHmAe0BrQEQAf8B9AHQAXYB/wP6Af8D+gH/A30B/wN/Af8DgAH/A4AB
|
||||
/wN+Af8DhAH/A7sB/wNqAf8BqAGAARwB/wJjAUgB9gQAAf8BswFvAv8BngFIAv8BiAEeAv8BfAEHAv8B
|
||||
eAEAAv8BmAFDAv8BzgG0Av8B1wHAAv8B6gHgAv8BnQFXAv8BfgERAv8BeAEAAv8BeAEAAf8B8AFxAQAB
|
||||
/wHLAWQBCQH/AWMBYQFdAd8E/wGGAYMBfgH/A4EB/wOBAf8BhgGDAXsB/wHPAZQBAAH/Ad4BzAGfAf8D
|
||||
gQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOTAf8DVwGyA2UB5wOBAf8DgQH/A4EB/wOBAf8D
|
||||
gQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DVQGvA2IB7gHvAbQBIQH/AfcB3AGXCf8D
|
||||
kQH/A4gB/wOHAf8DhwH/A4EB/wNXAf8D5gH/A6MB/wG2AZEBNgH/AmoBQQH5BAAB/wHMAZ8C/wGsAWMC
|
||||
/wGTATMC/wGBAREC/wF5AQIC/wGCARYC/wGaAUsC/wGuAXgC/wGlAVcC/wGBARcC/wF5AQQC/wF4AQAC
|
||||
/wF4AQAB/wHwAXEBAAH/AdUBcQEXAf8CYwFdAd8E/wGLAYYBeQH/A4EB/wOBAf8BjgGGAXEB/wHPAZQB
|
||||
AAH/Ad4BzAGfAf8DoQH/A6EB/wOhAf8DoQH/A6EB/wOhAf8DoQH/A6EB/wOhAf8DbwHzA18B+wOBAf8D
|
||||
gQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DVQGvA0sBjQHwAb4B
|
||||
PwH/AfQBzQFsIf8D+wH/A9AB/wHXAacBMQH/AmEBXQHRBAAB/wHpAdUC/wG8AYEC/wGkAVQC/wGOASoC
|
||||
/wF/AQ0C/wF5AQIC/wF7AQkC/wGCAR0C/wF4AQAC/wF4AQAC/wF4AQEC/wF6AQQC/wF6AQMB/wHzAXQB
|
||||
AwH/AeIBhAEyAf8DYwHfBP8BpwGUAWcB/wGDAYIBfwH/AYUBgwF+Af8BsAGUAU4B/wHTAZcBAgH/AeAB
|
||||
zgGfAf8D5wH/A+cB/wPnAf8D5wH/A+cB/wPnAf8D5wH/A+cB/wPAAf8DZAHbA2gB9AOBAf8DgQH/A4EB
|
||||
/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DVQGvAwcBCQNiAe4B8QG8ATsB
|
||||
/wH6AeoBwgH/A9wB/wN3Af8DaAH/A2gB/wNoAf8DMgn/AfIB3QGpAf8B6gGpAQgB/wM+AWoEAANeAdID
|
||||
agH5Af8BuwF9Av8BowFSAv8BkAEsAv8BggETAv8BfQEIAv8BegEEAv8BeQECAv8BegEEAv8BfQEJAv8B
|
||||
gAEPAv8BfwENAf8B+AGGASAB/wNoAfQDWAG4BP8B1wGxAVIB/wGaAY8BdAH/AaABkgFtAf8B4AGvATcB
|
||||
/wHnAakBEAH/AesB1QGgAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOTAf8DPAFkA18B
|
||||
yQN9AfoDgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wN9AfoDVQGqBAAD
|
||||
MwFRA2gB8AHzAcYBWAH/AfoB5wG4Fv8B/gH7Af8B+QHiAaoB/wHvAbgBLQH/A04BlgQCBAADPAFmA2MB
|
||||
1QN8AfgB/wG+AYUC/wGqAV8C/wGZAT4C/wGNAScC/wGGARoC/wGDARUC/wGFARkC/wGKASIC/wGNASgC
|
||||
/wGTATMB/wJuAWgB9QNdAcUDNgFZBP8B9AHNAWwB/wH0AcsBZgH/AfQBywFlAf8B9AHLAWUB/wHxAcEB
|
||||
SQH/AfkB4wGsAf8DiQH/A4kB/wOJAf8DiQH/A4kB/wOJAf8DiQH/A4kB/wOaAf8DBgEIAzEBTANQAZsD
|
||||
ZQHsA30B+gOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DfQH6A2oB7QNQAZsDLwFJCAADIgExA18B
|
||||
yQJ9AWcB+gHzAcoBZQH/AfkB4QGmAf8B+wHtAcwB/wH7AewByAH/AfgB3QGbAf8DgAH+AmUBXgHiAz0B
|
||||
aAQBDAADQgFyA2MB1QNqAfkB/wHJAZkC/wG8AX8C/wGuAWYC/wGkAVMC/wGfAUoC/wGfAUsC/wGjAVEC
|
||||
/wGnAVgB/wN8AfgDXQHHAzsBYgQAQP8IAAMFAQYDEgEXAzoBYANRAZ8DXwHTA2cB7wNjAfYDYgHuA14B
|
||||
0gNRAZ4DOQFfAxEBFgMFAQYUAAMPARMDRwGCA2QB2wJ+AW8B/ANnAeoDVAGoAygBOxwAAzwBZQNeAdIB
|
||||
/wHvAeAC/wHcAbwC/wHNAZ8C/wHBAYoC/wG7AX8C/wG/AYYC/wHNAaEC/wHpAdYB/wNcAcQDNQFVCAAB
|
||||
QgFNAT4HAAE+AwABKAMAAUADAAEgAwABAQEAAQEGAAEBFgAD/4UAAf8B/AHAAQMEAAH/AfwBgAEBBAAB
|
||||
/wH5BgAB/wH5BgAB8AETBgABwAEDBAAC/wGAAQEEAAHAAQEBgAEBBAABgAIAAQEHAAEBBwABAQcAAQEH
|
||||
AAEBBgABgAEBBgABwAEDAYABAQIAAcABAQHwAR8BwAEDCw==
|
||||
</value>
|
||||
</data>
|
||||
<metadata name="ilStatusIcons.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>13, 101</value>
|
||||
</metadata>
|
||||
<data name="ilStatusIcons.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>
|
||||
AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs
|
||||
LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu
|
||||
SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAihMAAAJNU0Z0AUkBTAIBAQQB
|
||||
AAHoAQEB6AEBARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMAASADAAEBAQABIAYAASD/
|
||||
AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AC4AAwYBBwM0AVQDUQGiA14B0gNaAekDYAHoA10B
|
||||
0QNQAZ8DMQFNAwUBBhgAAwYBBwM0AVQDUQGiA14B0gNaAekDYAHoA10B0QNQAZ8DMQFNAwUBBhgAAwYB
|
||||
BwM0AVQDUQGiA14B0gNaAekDYAHoA10B0QNQAZ8DMQFNAwUBBhgAAwYBBwM0AVQDUQGiA14B0gNaAekD
|
||||
YAHoA10B0QNQAZ8DMQFNAwUBBhQAAyABLQNUAasDWwHkA1oB9QMkAfsDYQH+A2EB/gMkAfsDUwH0A2IB
|
||||
4QNRAaEDHgEqEAADIAEtA1QBqwNbAeQDWgH1ASEBXgEhAfsBPQF9AT0B/gE9AX0BPQH+ASEBXgEhAfsD
|
||||
UwH0A2IB4QNRAaEDHgEqEAADIAEtA1QBqwNbAeQDWgH1ASECXgH7AT0CfQH+AT0CfQH+ASECXgH7A1MB
|
||||
9ANiAeEDUQGhAx4BKhAAAyABLQNUAasDWwHkA1oB9QIhAV4B+wI9AX0B/gI9AX0B/gIhAV4B+wNTAfQD
|
||||
YgHhA1EBoQMeASoMAAMbASUDWAG9A1oB8gNlAf4DMAH/AzkB/wM8Af8DNgH/AyoB/wMkAf8DQAH9A14B
|
||||
8ANWAbIDGgEjCAADGwElA1gBvQNaAfIBPQGAAT0B/gEAAVcBAAH/AQABZwEAAf8BAAFsAQAB/wEAAWEB
|
||||
AAH/AQABTAEAAf8BAAFAAQAB/wNAAf0DXgHwA1YBsgEZARoBGQEjCAADGwElA1gBvQNaAfIBPQKAAf4B
|
||||
AAJXAf8BAAJnAf8BAAJsAf8BAAJhAf8BAAJMAf8BAAJAAf8DQAH9A14B8ANWAbIBGQIaASMIAAMbASUD
|
||||
WAG9A1oB8gI9AYAB/gIAAVcB/wIAAWcB/wIAAWwB/wIAAWEB/wIAAUwB/wIAAUAB/wNAAf0DXgHwA1YB
|
||||
sgIZARoBIwQAAwMBBANSAaUDYAHzA0kB/wNVAf8DZQH/A3EB/wN1Af8DcQH/A2QB/wNMAf8DMQH/A2EB
|
||||
/gNiAe4DUAGaAwMBBAMDAQQBUgFTAVIBpQFgAW8BYAHzAQABggEAAf8BAAGZAQAB/wEAAbYBAAH/AQAB
|
||||
zAEAAf8BAAHTAQAB/wEAAcsBAAH/AQABswEAAf8BAAGIAQAB/wEAAVcBAAH/AT0BfQE9Af4DYgHuA1AB
|
||||
mgMDAQQDAwEEAVICUwGlAWACbwHzAQACggH/AQACmQH/AQACtgH/AQACzAH/AQAC0wH/AQACywH/AQAC
|
||||
swH/AQACiAH/AQACVwH/AT0CfQH+A2IB7gNQAZoDAwEEAwMBBAJSAVMBpQJgAW8B8wIAAYIB/wIAAZkB
|
||||
/wIAAbYB/wIAAcwB/wIAAdMB/wIAAcsB/wIAAbMB/wIAAYgB/wIAAVcB/wI9AX0B/gNiAe4DUAGaAwMB
|
||||
BAMtAUQDYAHoA4AB/gNuAf8DewH/A4UB/wOKAf8DjAH/A4oB/wOFAf8DdgH/A1cB/wMyAf8DQAH9A14B
|
||||
3QMqAT8DLQFEAWABaQFgAegBPQGAAT0B/gEAAcYBAAH/AQAB3AEAAf8BAAHuAQAB/wEAAfgBAAH/AQAB
|
||||
+wEAAf8BAAH5AQAB/wEAAe8BAAH/AQAB1AEAAf8BAAGcAQAB/wEAAVoBAAH/A0AB/QNeAd0DKgE/Ay0B
|
||||
RAFgAmkB6AE9AoAB/gEAAsYB/wEAAtwB/wEAAu4B/wEAAvgB/wEAAvsB/wEAAvkB/wEAAu8B/wEAAtQB
|
||||
/wEAApwB/wEAAloB/wNAAf0DXgHdAyoBPwMtAUQCYAFpAegCPQGAAf4CAAHGAf8CAAHcAf8CAAHuAf8C
|
||||
AAH4Af8CAAH7Af8CAAH5Af8CAAHvAf8CAAHUAf8CAAGcAf8CAAFaAf8DQAH9A14B3QMqAT8DTgGVA3cB
|
||||
+AN/Af8DhQH/A4oB/wONAf8DjgH/A44B/wOOAf8DjQH/A4kB/wN3Af8DTQH/AyUB/wNaAfIDSgGLA04B
|
||||
lQFcAXwBXAH4AQAB5QEAAf8BAAHvAQAB/wEAAfgBAAH/AQAB/QEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB
|
||||
/wEAAf8BAAH+AQAB/wEAAfYBAAH/AQAB1QEAAf8BAAGLAQAB/wEAAUEBAAH/A1oB8gNKAYsDTgGVAVwC
|
||||
fAH4AQAC5QH/AQAC7wH/AQAC+AH/AQAC/QH/AQAD/wEAA/8BAAP/AQAC/gH/AQAC9gH/AQAC1QH/AQAC
|
||||
iwH/AQACQQH/A1oB8gNKAYsDTgGVAlwBfAH4AgAB5QH/AgAB7wH/AgAB+AH/AgAB/QH/AgAC/wIAAv8C
|
||||
AAL/AgAB/gH/AgAB9gH/AgAB1QH/AgABiwH/AgABQQH/A1oB8gNKAYsDXwHTA34B/AOTAf8DjgH/A40B
|
||||
/wOOAf8DjgH/A44B/wOOAf8DjgH/A40B/wOFAf8DZwH/AzQB/wNBAfkDWgHEAVsBXwFbAdMBKwF+ASsB
|
||||
/AEOAfsBDgH/AQMB/QEDAf8BAAH+AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB
|
||||
/wEAAf8BAAH9AQAB/wEAAe8BAAH/AQABuQEAAf8BAAFdAQAB/wNBAfkDWgHEAVsCXwHTASsCfgH8AQ4C
|
||||
+wH/AQMC/QH/AQAC/gH/AQAD/wEAA/8BAAP/AQAD/wEAA/8BAAL9Af8BAALvAf8BAAK5Af8BAAJdAf8D
|
||||
QQH5A1oBxAJbAV8B0wIrAX4B/AIOAfsB/wIDAf0B/wIAAf4B/wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAB
|
||||
/QH/AgAB7wH/AgABuQH/AgABXQH/A0EB+QNaAcQDbgH1A4AB/gOfAf8DkwH/A48B/wOOAf8DjgH/A44B
|
||||
/wOOAf8DjgH/A44B/wOLAf8DdwH/A0gB/wNAAf0DYgHhAVoBbgFaAfUBYQGFAWEB/gEnAf8BJwH/AQsB
|
||||
/wELAf8BAQH/AQEB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB
|
||||
/wEAAfkBAAH/AQAB1gEAAf8BAAGBAQAB/wNAAf0DYgHhAVoCbgH1AWEChQH+AScD/wELA/8BAQP/AQAD
|
||||
/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAC+QH/AQAC1gH/AQACgQH/A0AB/QNiAeECWgFuAfUCYQGFAf4C
|
||||
JwL/AgsC/wIBAv8CAAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAH5Af8CAAHWAf8CAAGBAf8DQAH9A2IB
|
||||
4QNjAfYDgAH+A6sB/wOZAf8DkAH/A44B/wOOAf8DjgH/A44B/wOOAf8DjgH/A40B/wN/Af8DVQH/A0AB
|
||||
/QNeAeIBSAFjAUgB9gGAAYUBgAH+AUIB/wFCAf8BGQH/ARkB/wEEAf8BBAH/AQAB/wEAAf8BAAH/AQAB
|
||||
/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/QEAAf8BAAHkAQAB/wEAAZgBAAH/A0AB
|
||||
/QNeAeIBSAJjAfYBgAKFAf4BQgP/ARkD/wEEA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAA/8BAAL9Af8B
|
||||
AALkAf8BAAKYAf8DQAH9A14B4gJIAWMB9gKAAYUB/gJCAv8CGQL/AgQC/wIAAv8CAAL/AgAC/wIAAv8C
|
||||
AAL/AgAC/wIAAf0B/wIAAeQB/wIAAZgB/wNAAf0DXgHiA2EB1gN+AfwDuAH/A6MB/wOTAf8DjgH/A44B
|
||||
/wOOAf8DjgH/A44B/wOOAf8DjQH/A4IB/wNcAf8DTQH6A1oBxwFcAWEBXAHWAWQBfgFkAfwBXwH/AV8B
|
||||
/wEvAf8BLwH/AQwB/wEMAf8BAQH/AQEB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB
|
||||
/wEAAf8BAAH+AQAB/wEAAeoBAAH/AQABpQEAAf8DTQH6A1oBxwFcAmEB1gFkAn4B/AFfA/8BLwP/AQwD
|
||||
/wEBA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAAv4B/wEAAuoB/wEAAqUB/wNNAfoDWgHHAlwBYQHWAmQB
|
||||
fgH8Al8C/wIvAv8CDAL/AgEC/wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAB/gH/AgAB6gH/AgABpQH/A00B
|
||||
+gNaAccDUAGaA2oB+QPFAf8DsgH/A5wB/wORAf8DjgH/A44B/wOOAf8DjgH/A48B/wOOAf8DgwH/A2AB
|
||||
/wNaAfIDTAGQA1ABmgNqAfkBfAH/AXwB/wFRAf8BUQH/AR8B/wEfAf8BBwH/AQcB/wEBAf8BAQH/AQAB
|
||||
/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQIB/wECAf8BAgH+AQIB/wEAAesBAAH/AQABrQEAAf8BWgFrAVoB
|
||||
8gNMAZADUAGaA2oB+QF8A/8BUQP/AR8D/wEHA/8BAQP/AQAD/wEAA/8BAAP/AQID/wECAv4B/wEAAusB
|
||||
/wEAAq0B/wFaAmsB8gNMAZADUAGaA2oB+QJ8Av8CUQL/Ah8C/wIHAv8CAQL/AgAC/wIAAv8CAAL/AgIC
|
||||
/wICAf4B/wIAAesB/wIAAa0B/wJaAWsB8gNMAZADLwFJA2wB6wOAAf4DxgH/A64B/wOcAf8DkwH/A5AB
|
||||
/wOPAf8DkAH/A5MB/wOTAf8DhQH/A0AB/QNgAeADLQFFAy8BSQNsAesBgAGFAYAB/gF/Af8BfwH/AUkB
|
||||
/wFJAf8BHwH/AR8B/wEMAf8BDAH/AQUB/wEFAf8BAwH/AQMB/wEFAf8BBQH/AQoB/wEKAf8BCgH+AQoB
|
||||
/wEBAe0BAQH/AUABtgFAAf0BYAFmAWAB4AMtAUUDLwFJA2wB6wGAAoUB/gF/A/8BSQP/AR8D/wEMA/8B
|
||||
BQP/AQMD/wEFA/8BCgP/AQoC/gH/AQEC7QH/AUACtgH9AWACZgHgAy0BRQMvAUkDbAHrAoABhQH+An8C
|
||||
/wJJAv8CHwL/AgwC/wIFAv8CAwL/AgUC/wIKAv8CCgH+Af8CAQHtAf8CQAG2Af0CYAFmAeADLQFFAwMB
|
||||
BANWAa4DbgH1A9kB/wPLAf8DtwH/A6cB/wOdAf8DmgH/A5wB/wOfAf8DmwH/A4kB/wNoAfADUgGjAwMB
|
||||
BAMDAQQDVgGuA24B9QGoAf8BqAH/AYkB/wGJAf8BXAH/AVwB/wE3Af8BNwH/ASIB/wEiAf8BGwH/ARsB
|
||||
/wEfAf8BHwH/ASYB/wEmAf8BHQH/AR0B/wEFAfMBBQH/AV4BaAFeAfADUgGjAwMBBAMDAQQDVgGuA24B
|
||||
9QGoA/8BiQP/AVwD/wE3A/8BIgP/ARsD/wEfA/8BJgP/AR0D/wEFAvMB/wFeAmgB8ANSAaMDAwEEAwMB
|
||||
BANWAa4DbgH1AqgC/wKJAv8CXAL/AjcC/wIiAv8CGwL/Ah8C/wImAv8CHQL/AgUB8wH/Al4BaAHwA1IB
|
||||
owMDAQQEAAMcAScDXQHHA2MB9gOAAf4D1wH/A8wB/wPCAf8DuwH/A7cB/wOxAf8DgAH+A2gB9ANZAbwD
|
||||
GwEmCAADHAEnA10BxwNjAfYBgAGFAYAB/gGlAf8BpQH/AYsB/wGLAf8BdAH/AXQB/wFmAf8BZgH/AVwB
|
||||
/wFcAf8BTgH/AU4B/wFtAYUBbQH+AVMBaAFTAfQBVwFZAVcBvAMbASYIAAMcAScDXQHHA2MB9gGAAoUB
|
||||
/gGlA/8BiwP/AXQD/wFmA/8BXAP/AU4D/wFtAoUB/gFTAmgB9AFXAlkBvAMbASYIAAMcAScDXQHHA2MB
|
||||
9gKAAYUB/gKlAv8CiwL/AnQC/wJmAv8CXAL/Ak4C/wJtAYUB/gJTAWgB9AJXAVkBvAMbASYMAAMhATAD
|
||||
WQG2A2IB7gN9AfoDvgH9A9QB/wPMAf8DvgH9A2oB+QNsAesDVQGsAx8BLBAAAyEBMANZAbYDYgHuA30B
|
||||
+gGuAb4BrgH9AZ8B/wGfAf8BjAH/AYwB/wFAAb4BQAH9AWgBagFoAfkBYQFsAWEB6wNVAawDHwEsEAAD
|
||||
IQEwA1kBtgNiAe4DfQH6Aa4CvgH9AZ8D/wGMA/8BQAK+Af0BaAJqAfkBYQJsAesDVQGsAx8BLBAAAyEB
|
||||
MANZAbYDYgHuA30B+gKuAb4B/QKfAv8CjAL/AkABvgH9AmgBagH5AmEBbAHrA1UBrAMfASwUAAMGAQcD
|
||||
NgFYA1UBrANmAeUDfgH8A18B+wNlAeIDUwGnAzMBUQMGAQcYAAMGAQcDNgFYA1UBrANmAeUDfgH8AV8B
|
||||
cwFfAfsDZQHiA1MBpwMzAVEDBgEHGAADBgEHAzYBWANVAawDZgHlA34B/AFfAnMB+wNlAeIDUwGnAzMB
|
||||
UQMGAQcYAAMGAQcDNgFYA1UBrANmAeUDfgH8Al8BcwH7A2UB4gNTAacDMwFRAwYBBwwAAUIBTQE+BwAB
|
||||
PgMAASgDAAFAAwABIAMAAQEBAAEBBgABARYAA/+BAAHgAQcB4AEHAeABBwHgAQcBwAEDAcABAwHAAQMB
|
||||
wAEDAYABAQGAAQEBgAEBAYABAVAAAYABAQGAAQEBgAEBAYABAQHAAQMBwAEDAcABAwHAAQMB4AEHAeAB
|
||||
BwHgAQcB4AEHCw==
|
||||
</value>
|
||||
</data>
|
||||
<metadata name="ilGames.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>24, 73</value>
|
||||
</metadata>
|
||||
<data name="ilGames.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>
|
||||
AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs
|
||||
LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu
|
||||
SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAJCUAAAJNU0Z0AUkBTAIBAQMB
|
||||
AAGoAQIBqAECASABAAEgAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABgAMAASADAAEBAQABIAYAAUB6
|
||||
AANcAecBCAEKAQAB/wMqAUAMAAMqAUADNgFXAz8BbAM/AWwDPwFsAz8BbAM/AWwDPwFsAz8BbAM/AWwD
|
||||
PwFsAz8BbAM/AWwDPwFsAz8BbAM/AWwDPwFsAz8BbAI7AToBYgMzAVEDGAEhVAADUwGiA1sBwCAAA1QB
|
||||
pgNZAbzwAAMhATADRgGAFAABFQEfAQQB/wENARUBAAH/AQgBCgEAAf8BCAEKAQAB/wwAA0QBegNTAacC
|
||||
YQFdAc8CYQFdAc8CYQFdAc8CYQFdAc8CYQFdAc8CYQFdAc8CYQFdAc8CYQFdAc8CYQFdAc8CYQFdAc8C
|
||||
YQFdAc8CYQFdAc8CYQFdAc8CYQFdAc8CYQFdAc8CYAFdAc4DWQG7AlABTwGbAyoBQFQAA18B0ANiAe4g
|
||||
AANhAdQDYwHp5AADWgG/AQgBCgEAAf8BCAEKAQAB/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB/wEIAQoB
|
||||
AAH/AQgBCgEAAf8DWgG/A1oBvwFDAXQBBwH/AUcBdwEMAf8BJQFHAQAB/wEOARkBAAH/DAACSwFKAYoC
|
||||
WgFYAb0CZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoC
|
||||
ZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCYwFaAekCXwFbAdMDVQGvAy4BSFQAA18B
|
||||
0ANiAe4gAANhAdQDYwHp4AABCAEKAQAB/wEQAR4BAAH/ASEBQQEAAf8BJwFLAQAB/wEmAUoBAAH/ASEB
|
||||
QQEAAf8BEAEeAQAB/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB/wEpAU4BAAH/AVoBlgEQAf8BWgGcARAB
|
||||
/wFzAbYBJgH/ARgBLgEAAf8MAANJAYYCWgFYAbcCZQFgAeMCZQFgAeMCZQFgAeMCZQFgAeMCagFhAeYC
|
||||
agFeAe0CaAFTAfQBfgF3ASsB/AH/AXgBAAL/AXgBAAH/Am4BWgH1AmoBYQHmAmUBYAHjAmUBYAHjAmUB
|
||||
YAHjAmUBXgHiAl4BWwHNAlUBUwGqAi4BLQFGVAADXwHQA2IB7iAAA2EB1ANjAencAAEIAQoBAAH/AT0B
|
||||
cQECAf8BTAGGAQcB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEQAf8BTAF/AQ8B
|
||||
/wE7AWcBCAH/ASEBNAEIAf8BUwGOAQsB/wFaAZwBEAH/AXIBswEnAf8BUwGBARsB/xAAAysBQQM2AVkC
|
||||
QAE/AW4CQAE/AW4CQAE/AW4CQAE/AW4DRAF7AlEBUAGfAl0BWwHFA2IB7gH/AXgBAAL/AXgBAAH/Al8B
|
||||
XQHJA0UBfAJAAT8BbgJAAT8BbgJAAT8BbgM/AW0DOwFjAzMBUgMZASJUAANfAdADYgHuIAADYQHUA2MB
|
||||
6dgAARUBKQEAAf8BSgGEAQQB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8B
|
||||
UgGMARAB/wFSAYwBEAH/AVIBjAEQAf8BWgGUARAB/wFWAZABDAH/AVoBmgEQAf8BWgGcARAB/wFyAakB
|
||||
MAH/AQgBCgEAAf8BCAEKAQAB/wwAAwwBEAMRARYDFQEcAxUBHAMVARwDFQEcAyEBMAI+AT0BaQJTAVIB
|
||||
pQJmAV8B5QH/AXgBAAL/AXgBAAH/AlUBUwGqAyIBMQMVARwDFQEcAxUBHAMUARsDEwEZAxABFQMHAQlU
|
||||
AANfAdADYgHuIAADYQHUA2MB6dQAARYBJwECAf8BSQGAAQcB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB
|
||||
/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQsB/wFSAYwBEAH/AVIBjAEQAf8BWAGSARAB/wFaAZQBEAH/AVoB
|
||||
mwEQAf8BWgGcARAB/wFcAZ4BEgH/ATsBbQEDAf8BCAEKAQAB/wEIAQoBAAH/AQgBCgEAAf8IAAMFBAYE
|
||||
CAEKAwgBCgMIAQoDCAEKAxcBHwI5ATgBXQNRAZ4CZQFgAeMB/wF4AQAC/wF4AQAB/wNSAaMDGAEhAwgB
|
||||
CgMIAQoDCAEKAwgBCgMHAQkDBgEHAwIBA1QAA18B0ANiAe4gAANhAdQDYwHp0AADXQHfAUcBgAEDAf8B
|
||||
UgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMARAB/wFSAYwB
|
||||
EAH/AVIBjAEQAf8BWgGUARAB/wFaAZQBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBnAEQAf8B
|
||||
WgGYARAB/wEWASoBAAH/AQgBCgEAAf8BCAEKAQAB/xwAAxIBFwM1AVYDUAGaA2IB4QH/AXgBAAL/AXgB
|
||||
AAH/AlEBUAGfAxIBGHAAA18B0ANiAe4gAANhAdQDYwHp0AABLAFQAQAB/wFKAYwBAAH/AVIBjAEIAf8B
|
||||
UgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBDgH/AVUBkgEQAf8BWgGcARAB/wFaAZwB
|
||||
EAH/AVoBlAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBlAEYAf8B
|
||||
WAGSARYB/wEQAR4BAAH/AQgBCgEAAf8cAAMSARcDNQFWA1ABmgNiAeEB/wF4AQAC/wF4AQAB/wJRAVAB
|
||||
nwMSARhwAANfAdADYgHuIAADYQHUA2MB6dQAA0sBjwEzAV4BAAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwB
|
||||
CAH/AVIBjAEQAf8BfwHAATMB/wFfAZ4BFwH/ASABPwEAAf8BCAEKAQAB/wFSAYwBEAH/AVoBnAEQAf8B
|
||||
WgGcARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGVARcB/wFaAZQBGAH/AVoBlAEYAf8BWgGUARgB/wEIAQoB
|
||||
AAH/AQgBCgEAAf8YAAMSARcDNQFWA1ABmgNiAeEB/wF4AQAC/wF4AQAB/wJRAVABnwMSARgUAAQBAwMB
|
||||
BAMGBAcBCQMHAQkDBAEFBAIEARQAAxEBFgMhAS8DIQEvAyEBLwMhAS8DIQEvAyEBLwMhAS8DIQEvAyEB
|
||||
LwNhAdkDcAHxAyEBLwMhAS8DIQEvAyEBLwMhAS8DIQEvAyEBLwMhAS8DYgHcA2oB7QMhAS8DIQEvAyEB
|
||||
LwMhAS8DIQEvAyEBLwMhAS8DIQEvAyEBLwMNARG4AAFCAXsBAAH/AVIBjAEIAf8BewHGASkB/wMzAVAE
|
||||
AAMMARABOQFrAQAB/wFaAZwBEAH/AVoBnAEQAf8BXQGXARMB/wFWAZQBDAH/AVoBnAEQAf8BWgGUARgB
|
||||
/wFaAZQBGAH/AWMBnAEYAf8BYwGlARcB/wEpAVABAAH/AQgBCgEAAf8YAAMSARcDNQFWA1ABmgNiAeEB
|
||||
/wF4AQAC/wF4AQAB/wJRAVABnwMSARgUAAQCAwkBDAMPARQDEwEaAxIBGAMKAQ0DBAEFBAEUAANpAegD
|
||||
fwH/A38B/wN/Af8DfwH/A38B/wN/Af8DfwH/A38B/wN/Af8DfwH/A38B/wN/Af8DfwH/A38B/wN/Af8D
|
||||
fwH/A38B/wN/Af8DfwH/A38B/wN/Af8DfwH/A38B/wN/Af8DfwH/A38B/wN/Af8DfwH/A38B/wN/Af8D
|
||||
YQHPvAABCAEKAQAB/wwAARMBIwEAAf8BWgGUARAB/wFaAZwBEAH/AZQB1gFKAf8BDQERAQIB/wExAVoB
|
||||
AAH/AVoBlAESAf8BWgGUARgB/wFaAZQBGAH/AWMBnAEYAf8BYwGlARcB/wFrAaUBIQH/ARABHgEAAf8Y
|
||||
AAMSARcDNQFWA1ABmgNiAeEB/wF4AQAC/wF4AQAB/wJRAVABnwMSARgUAAMFAQYDHQEpAzABSgI7ATwB
|
||||
ZQI7ATwBZAMoATwCFQEWAR0DBgEIFAADPAFkA0wBjwNMAY8DTAGPA0wBjwNMAY8DTAGPA0wBjwNMAY8D
|
||||
TAGPA2cB6gN8AfgDTAGPA0wBjwNMAY8DTAGPA0wBjwNMAY8DTAGPA0wBjwNlAewDbgH1A0wBjwNMAY8D
|
||||
TAGPA0wBjwNMAY8DTAGPA0wBjwNMAY8DTAGPAzUBVqgAA10B3wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB
|
||||
/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB/wMzAVADOgFgAUsBhQEHAf8BWgGUARAB/wFaAZwBEAH/ATkB
|
||||
awEAAf8DCQEMARABHgEAAf8BVAGOARIB/wFaAZQBGAH/AWMBnAEYAf8BYwGcARgB/wFjAaUBFwH/AXMB
|
||||
tAEpAf8BEAEeAQAB/xgAAxIBFwM1AVYDUAGaA2IB4QH/AXgBAAL/AXgBAAH/AlEBUAGfAxIBGBQAAwkB
|
||||
DAMzAVACTAFNAZECXQFfAckCWwFdAcoDRAF6AykBPQMMARA8AANfAdADYgHuIAADYQHUA2MB6cwAAQgB
|
||||
CgEAAf8BCAEKAQAB/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB
|
||||
/wEIAQoBAAH/ATMBXwECAf8BWgGUARAB/wFaAZwBEAH/Aa0B5wFjAf8BEAEeAQAB/wEIAQoBAAH/ARQB
|
||||
JgEAAf8BVAGOARIB/wFiAZsBGAH/AWMBnAEYAf8BYwGlARcB/wFjAaUBFwH/AWMBnAEhAf8BGAEuAQAB
|
||||
/xgAAxIBFwM1AVYDUAGaA2IB4QH/AXgBAAL/AXgBAAH/AlEBUAGfAxIBGBQAAwkBCwMuAUcDSAGEAlkB
|
||||
XAHDAlwBXwHLA0kBhQMuAUcDDwETPAADXwHQA2IB7iAAA2EB1ANjAenIAAEIAQoBAAH/ASsBUgEAAf8B
|
||||
QQFyAQUB/wFKAYQBBgH/AUoBhAEGAf8BSgGEAQYB/wFCAXMBBgH/ASkBUAEAAf8BEAEeAQAB/wEfAToB
|
||||
AAH/AVUBjwELAf8BWgGVARAB/wFaAZwBEAH/AdYB/wGMAf8BEAEeAQAB/wEYAS4BAAH/AUIBeAEDAf8B
|
||||
WgGUARgB/wFiAZsBGAH/AWMBnAEYAf8BYwGlARcB/wFjAaUBFwH/AXMBtAEpAf8BEAEeAQAB/xgAAxIB
|
||||
FwM1AVYDUAGaA2IB4QH/AXgBAAL/AXgBAAH/AlEBUAGfAxIBGBQAAwYBCAMkATQDPAFmA1MBpwNYAbgC
|
||||
RwFIAYMDMQFNAw8BFDwAA18B0ANiAe4gAANhAdQDYwHpxAABKAFNAQAB/wFOAYgBBwH/AVIBjAEIAf8B
|
||||
UgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEQAf8BUgGMARAB/wFSAYwB
|
||||
EAH/AVoBlAEQAf8BWgGcARAB/wFjAaUBFwH/AUIBewEAAf8BSgGEAQYB/wFSAYwBCAH/AVoBmAEUAf8B
|
||||
WgGUARgB/wFjAZwBGAH/AWMBpQEXAf8BYwGlARcB/wFjAaUBFwH/AZQByQFNAf8EAAMQARUDGgEkAyEB
|
||||
LwMRARYEAgQBAxIBFwM1AVYDUAGaA2IB4QH/AXgBAAL/AXgBAAH/AlEBUAGfAxIBGBQAAwMBBAMTARkD
|
||||
JQE2AjsBPAFkAkEBQgFyAzMBUQMhAS8DCQEMPAADXwHQA2IB7iAAA2EB1ANjAenAAAEpAU4BAgH/AVIB
|
||||
jAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMARAB
|
||||
/wFSAYwBEAH/AVIBjAEQAf8BWgGUARAB/wFaAZUBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEAH/AVoB
|
||||
nAEQAf8BWgGUARgB/wFaAZQBGAH/AWMBnAEYAf8BYwGcARgB/wFjAaUBFwH/AWMBpQEXAf8BYwGlARcB
|
||||
/wFlAaABIQH/BAADHgErAjEBMAFMAzsBYwMiATEDBwEJAwQBBQMSARgDNgFXA1ABmgNiAeEB/wF4AQAC
|
||||
/wF4AQAB/wJRAVABnwMSARgcAAMHAQkDHAEnAyMBMgIZARoBIwMPARQDBAEFPAADXwHQA2IB7iAAA2EB
|
||||
1ANjAem8AANGAYABTgGIAQcB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8B
|
||||
UgGMAQgB/wFSAYwBCAH/AVIBjAEQAf8BUgGMARAB/wFSAYwBEAH/AVoBlAEQAf8BWgGXARAB/wFaAZwB
|
||||
EAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBlAEYAf8BWgGUARgB/wFjAZwBGAH/AWMBoQEYAf8B
|
||||
YwGlARcB/wFjAaUBFwH/AXgBugEsAf8BCAEKAQAB/wQAAyQBNANFAXwCWgFYAbcDTgGUAz8BbQMoATsD
|
||||
HwEsAzkBXgNQAZoDYgHhAf8BeAEAAv8BeAEAAf8CUQFQAZ8DEgEYHAADEgEXAzwBZgNKAYkDQAFvAy4B
|
||||
RwMOARI8AANfAdADYgHuIAADYQHUA2MB6bwAATUBXgEHAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8B
|
||||
UgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEQAf8BUgGMARAB/wFaAZQB
|
||||
EAH/AVoBlAEQAf8BWgGbARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZYBFgH/AVoBlAEYAf8B
|
||||
XQGXARgB/wFjAZwBGAH/AWMBpQEXAf8BYwGlARcB/wFwAbMBIAH/ASsBUAEEAf8IAAMnAToCUwFRAaIB
|
||||
YQFfASEB+wJlAVwB5wJcAVoBxAJDAUIBdQMxAU0CQAE/AW4CUQFQAZ8CZQFgAeMB/wF4AQAC/wF4AQAB
|
||||
/wJRAVABnwMSARgcAAMZASIDTgGVAlsBXgHNAlYBVwGyA0QBegMdASkDBgEIBAIEATAAA18B0ANiAe4g
|
||||
AANhAdQDYwHpvAABSgGEAQYB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8B
|
||||
ZwGpARcB/wFSAYwBCAH/AUoBhAEGAf8BSgGEAQYB/wFSAYwBEAH/AVoBlAEQAf8BWgGXARAB/wFaAZwB
|
||||
EAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBlAEYAf8BWgGUARgB/wFfAZgBGAH/AWMBngEYAf8B
|
||||
YwGlARcB/wFrAakBHQH/ASkBUAEAAf8MAAMiATEDTgGYAm8BYAHzAmgBXgHwAmoBYQHmAloBVwHCAlUB
|
||||
UwGqA1MBpwJZAVcBvAJsAWEB6wH/AXgBAAL/AXgBAAH/AlEBUAGfAxIBGBwAAxQBGwJDAUQBdwJWAVkB
|
||||
tgJbAV4BzQJWAVgBswM/AWwDJgE4AwwBDwMCAQMIAAMCAQMDDQERAw0BEQMNAREDDQERAw0BEQMNARED
|
||||
DQERAw0BEQMNAREDXwHTA2cB7wMNAREDDQERAw0BEQMNAREDDQERAw0BEQMNAREDDQERA2IB1wNnAeoD
|
||||
DQERAw0BEQMNAREDDQERAw0BEQMNAREDDQERAw0BEQMNAREDBAEFlAABSgGEAQYB/wFSAYwBCAH/AVIB
|
||||
jAEIAf8BUgGMAQgB/wFSAYwBCAH/AWkBpAEeAf8BLAFQAQMB/wEIAQoBAAH/ATcBYQEHAf8BUgGMAQ4B
|
||||
/wFSAYwBEAH/AX8BwQEyAf8BWwFeAVsB0wNaAb8BLwFZAQAB/wFEAXoBBQH/AVABigEIAf8BWgGcAQ4B
|
||||
/wFaAZwBEAH/AVoBnAEQAf8BTwGGARAB/wFEAXQBDAH/A1oBvxAAAhoBGQEjA0QBewJdAVsBygJjAV8B
|
||||
2gJpAWAB6AJnAVkB7wJlAV0B7AJhAVwB1gJfAVsB2AJoAVMB9AH/AXgBAAL/AXgBAAH/AlEBUAGfAxIB
|
||||
GBwAAw8BEwM0AVMDTQGSAl0BYQHPAl0BYQHUAlIBVAGoAkEBQgFyAyYBOAMUARsDBgEIAwIBAwNaAcID
|
||||
fwH/A38B/wN/Af8DfwH/A38B/wN/Af8DfwH/A38B/wN/Af8DfwH/A38B/wN/Af8DfwH/A38B/wN/Af8D
|
||||
fwH/A38B/wN/Af8DfwH/A38B/wN/Af8DfwH/A38B/wN/Af8DfwH/A38B/wN/Af8DfwH/A38B/wN/Af8D
|
||||
YgHclAABSgGMAQAB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AWcBnQEnAf8BCAEKAQAB
|
||||
/wEKAQ8BAAH/AUIBdwEDAf8BUgGMARAB/wFaAZwBEAH/ASUBQQEFAf8EAAM6AWABCAEKAQAB/wEIAQoB
|
||||
AAH/BAADRgGAA0YBgANGAYAcAAMKAQ0DIgExAzQBVANEAXgCUQFQAZ8CYQFdAc8CagFeAe0CZQFdAewC
|
||||
aAFeAfABYQFfASEB+wH/AXgBAAL/AXgBAAH/AlEBUAGfAxIBGBwAAwYBCAMYASEDMQFNAkwBTQGRAlgB
|
||||
WgG9Al0BYQHRAlkBXAHDAlEBUwGiAz0BZwIZARoBIwMMAQ8DQAFvA1UBrQNVAa0DVQGtA1UBrQNVAa0D
|
||||
VQGtA1UBrQNVAa0DVQGtA2gB8AN9AfoDVQGtA1UBrQNVAa0DVQGtA1UBrQNVAa0DVQGtA1UBrQNwAfED
|
||||
fAH4A1UBrQNVAa0DVQGtA1UBrQNVAa0DVQGtA1UBrQNVAa0DVQGtA0cBgZQAATsBbQECAf8BUgGMAQgB
|
||||
/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFTAY4BEAH/AQ8BGwEAAf8BIwFDAQAB/wFSAYwBEAH/AVIB
|
||||
jAEQAf8BewG9ATAB/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB
|
||||
/wEIAQoBAAH/KAADAwEEAwkBCwMiATEDOAFbAk8BTgGXAl8BXAHIAmYBXwHlAm8BUQH3Ab4CQAH9Af8B
|
||||
eAEAAv8BeAEAAf8CUQFQAZ8DEgEYHAAEAQMCAQMDFQEcAzUBVgJLAUwBjwJcAV8ByAJdAWMB3wJgAWUB
|
||||
4wJSAVMBpQM0AVMDHAEnKAADXwHQA2IB7iAAA2EB1ANjAem8AAEIAQoBAAH/AVIBjAEIAf8BUgGMAQgB
|
||||
/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFOAYIBDwH/AUoBhAEGAf8BUgGMARAB/wFjAaUBFwH/AQgB
|
||||
CgEAAf8BCAEKAQAB/wETASMBAAH/AUIBcwEGAf8BIAE/AQAB/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB
|
||||
/wEIAQoBAAH/AQgBCgEAAf8gAAQBAwMBBAMMARADGAEgAykBPQM+AWoCVwFWAbUCZgFfAeUCbwFRAfcB
|
||||
/wF4AQAC/wF4AQAB/wJRAVABnwMSARggAAQBAwcBCQMUARsDKgFAA0MBdgNVAa8CWgFjAekCWwFfAdAC
|
||||
UAFRAZ8DMwFRKAADXwHQA2IB7iAAA2EB1ANjAenAAAFCAXMBBgH/AVIBjAEIAf8BUgGMAQgB/wFSAYwB
|
||||
CAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBEAH/AVIBjAEQAf8BSgGEAQYB/wEQAR4BAAH/ATEBWgEAAf8B
|
||||
TQGEAQ0B/wFaAZwBEAH/AVoBnAEQAf8BUgGMAQgB/wEQAR4BAAH/AQgBCgEAAf8BCAEKAQAB/wNGAYAs
|
||||
AAMCAQMDCwEOAyABLgNDAXYCVwFVAbECZgFgAeACYwFIAfYCagFBAfkCUQFQAZwDEgEXDAAEAQMMARAD
|
||||
FwEfAx0BKAMdASgDDAEPCAADDwEUAiYBJwE5AkcBSAGDA2IB4QJcAWUB5wNeAdICPwFAAW4oAANfAdAD
|
||||
YgHuIAADYQHUA2MB6cQAAUkBiQEAAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwB
|
||||
EAH/AVIBjAEQAf8BUgGMARAB/wFSAYwBEAH/AVoBlAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBnAEQAf8B
|
||||
WgGcARAB/wFaAZQBGAH/AUIBcwEGAf8BCgEOAQAB/zAABAEDAwEEAwwBDwMeASoDOgFhAlkBVwG5AmMB
|
||||
WwHkA2IB7gJPAU4BlwMSARcMAAMCAQMDIQEvAzYBWQJCAUMBdQJBAUIBcwMeASsIAAMEAQUDDAEPAzgB
|
||||
XAJdAWABzgJdAWUB7AJZAWcB7wNGAX8oAANfAdADYgHuIAADYQHUA2MB6cgAAToBawEAAf8BUgGMAQgB
|
||||
/wFSAYwBCAH/AVIBjAEIAf8BUgGMARAB/wFSAYwBEAH/AVoBlAEQAf8BWgGUARAB/wFaAZwBEAH/AVoB
|
||||
nAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBlAEYAf8BWgGUARgB/wFjAaUBFwH/ARkBLAEDAf84AAMCAQMD
|
||||
CAEKAyABLQJBAUABcQJNAUwBkQNQAZoCOwE6AWIDDAEPDAADAwEEAysBQQNEAXoDUwGnA1UBrQM3AVoD
|
||||
GAEgAwkBCwMGAQcDDQERAzkBXwJdAWEB0QJZAWcB7wJgAW8B8wJGAUcBgSgAA18B0ANiAe4gAANhAdQD
|
||||
YwHpzAABLAFVAQAB/wFSAYwBCAH/AVIBjAEIAf8BUgGMARAB/wFSAYwBEAH/AVoBlAEQAf8BWgGUARAB
|
||||
/wFaAZwBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBlAEYAf8BWgGUARgB/wEhAUEBAAH/QAAE
|
||||
AgMHAQkDEAQVARwCFgEVAR0DDwETAwIBAwwAAwMBBAMwA0sBTAGPAlsBXQHKAlsBYQHeA04BlAM0AVMD
|
||||
FQEcAw0BEQMeASsCQwFEAXcCXQFjAd8CZQFwAfECWgFjAekDRAF7KAADXwHQA2IB7iAAA2EB1ANjAenI
|
||||
AAESASIBAAH/AUwBhgEGAf8BUgGMAQgB/wFaAZwBEAH/AVABigEIAf8BUgGMARAB/wFaAZQBEAH/AVoB
|
||||
nAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGcAREB/wFpAasBHwH/AQgBCgEAAf9sAAMCAQMD
|
||||
IQEvAzoBYQNVAa0CXwFjAdoDWgG/AlABUQGfA0QBegJBAUIBcgNJAYUCVgFXAbICXgFqAe0CYAFkAdsC
|
||||
VQFXAbEDOAFbKAADXwHQA2IB7iAAA2EB1ANjAenIAAEQAR4BAAH/AUgBfQEHAf8BWQGTARMB/wFVAYgB
|
||||
GAH/CAABIQFBAQAB/wFCAXsBAAH/AVIBjAEIAf8BVQGRAQgB/wE5AWYBBAH/A1kB73gAAwYBCAMXAR8D
|
||||
RAF7AlkBXAHGAlsBYwHkAlMBaAH0A2IB7gNiAe4CZQFwAfECSAFjAfYCKwF+AfwCWQFcAb4DPgFrAyQB
|
||||
NCgAA18B0ANiAe4gAANhAdQDYwHp0AABHgE6AQAB/5wABAIDCQEMAyoDPwFAAW4DTgGWAlYBWAGzAlkB
|
||||
XAHBAloBXQHHAloBXQHHAlcBWQG5AlEBUgGkAkABQQFxAyUBNgMTARkoAANfAdADYgHuIAADYQHUA2MB
|
||||
6f8AeQAEAQMLAQ4DJgE4AzkBXgNGAX0CSgFLAYsDSgGJAz4BawMqAT8DFwEfAwIBAywAA1MBogNaAb8g
|
||||
AANUAaYDWQG7qAABQgFNAT4HAAE+AwABKAMAAYADAAEgAwABAQEAAQEGAAECFgAD/wEAA/8BxwIAAQcC
|
||||
/wHPAfMB/wQAAv8BzwGHAgABBwL/Ac8B8wH/BAAB/wH+AQABBwIAAQcC/wHPAfMB/wQAAf8B/AEAAQcC
|
||||
AAEHAv8BzwHzAf8EAAH/AfgBAAEPAgABBwL/Ac8B8wH/BAAB/wHwAQABBwIAAQcC/wHPAfMB/wQAAf8B
|
||||
4AEAAQMCAAEHAv8BzwHzAf8EAAH/AcABAAEBAfwBAwP/Ac8B8wH/BAAB/wHAAQABAQH8AQMD/wHPAfMB
|
||||
/wQAAf8B4AIAAfwBAwHgAR8IAAH/AfwBIAEAAfwBAwHgAR8IAAH/Af4B4AEAAfwBAwHgAR8IAAH/AcAC
|
||||
AAH8AQMB4AEfAf8BzwHzAf8EAAH/AYACAAH8AQMB4AEfAf8BzwHzAf8EAAH/AwAB/AEDAeABHwH/Ac8B
|
||||
8wH/BAAB/gIAAQEBAAEDAeABHwH/Ac8B8wH/BAAB/AIAAQEBAAEDAfgBHwH/Ac8B8wH/BAAB+AIAAQEB
|
||||
AAEDAfgBHwH/Ac8B8wH/BAAB+AIAAQMBAAEDAfgBAwH/Ac8B8wH/BAAB+AIAAQcBAAEDAfgBAwgAAfgC
|
||||
AAEPAQABAwH4CQAB+AEAAUQBfwEAAQMB+AkAAfgBAAEBAf8BgAEDAfgBAAH/Ac8B8wH/BAAB+AIAAX8B
|
||||
gAEDAfwBAAH/Ac8B8wH/BAAB/AIAAX8B8AEDAYEBgAH/Ac8B8wH/BAAB/gIAAf8B8AEDAYEBgAH/Ac8B
|
||||
8wH/BAAB/wIAAf8B/AEDAYABAAH/Ac8B8wH/BAAB/wGAAQEB/wH+AQMBgAEAAf8BzwHzAf8EAAH/AQAB
|
||||
AwP/AYABAAH/Ac8B8wH/BAAB/wEMAQ8D/wHAAQAB/wHPAfMB/wQAAf8B3wT/AcABAAH/Ac8B8wH/BAAG
|
||||
/wHwAQEB/wHPAfMB/wQACw==
|
||||
</value>
|
||||
</data>
|
||||
<metadata name="ilStoreThumbnails.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>12, 128</value>
|
||||
</metadata>
|
||||
<metadata name="ilProfilePics.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
@ -484,7 +128,7 @@
|
||||
AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs
|
||||
LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu
|
||||
SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAA0A0AAAJNU0Z0AUkBTAMBAQAB
|
||||
MAECATABAgEgAQABIAEABP8BIQEACP8BQgFNATYHAAE2AwABKAMAAYADAAEgAwABAQEAASAGAAFAEgAD
|
||||
2AEAAdgBAAEgAQABIAEABP8BIQEACP8BQgFNATYHAAE2AwABKAMAAYADAAEgAwABAQEAASAGAAFAEgAD
|
||||
rQH/A7oB/wO6Af8DuQH/A7oB/wO6Af8D2gX/A/wB/wP+Df8D/QH/A/wR/wP8Af8D/g3/A/0B/wPZAf8D
|
||||
ugH/A7oB/wO6Af8DugH/A7oB/wO6Af//AIEAA58B/wO6Af8DugH/A7oB/wO6Af8DugH/A9oJ/wP9Af8D
|
||||
/g3/A/0B/wP9Ef8D/AH/A/4N/wPaAf8DugH/A7oB/wO6Af8DugH/A7oB/wO6Af//AIEAA6IB/wO6Af8D
|
||||
@ -543,6 +187,337 @@
|
||||
ugH/A7oB/wO6Af8DugH/A7oB/wO6Af8DugH/A7oB/wO6Af8DugH/A7oB/wO6Af8DugH/A7oB/wO6Af8D
|
||||
ugH/A7oB/wO6Af8DugH/A7kB/wO6Af8DugH/A7oB/wO6Af8DugH/A7oB/wO6Af8DugH/A7oB//8AgQAB
|
||||
QgFNAT4HAAE+AwABKAMAAYADAAEgAwABAQEAAQEGAAECFgAD//8A/wADAAs=
|
||||
</value>
|
||||
</data>
|
||||
<metadata name="ilStatusIcons.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>13, 101</value>
|
||||
</metadata>
|
||||
<data name="ilStatusIcons.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>
|
||||
AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs
|
||||
LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu
|
||||
SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAKhQAAAJNU0Z0AUkBTAIBAQQB
|
||||
AAGQAQABkAEAARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMAASADAAEBAQABIAYAASD/
|
||||
AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AC4AAwYBBwM0AVQDUQGiA14B0gNaAekDYAHoA10B
|
||||
0QNQAZ8DMQFNAwUBBhgAAwYBBwM0AVQDUQGiA14B0gNaAekDYAHoA10B0QNQAZ8DMQFNAwUBBhgAAwYB
|
||||
BwM0AVQDUQGiA14B0gNaAekDYAHoA10B0QNQAZ8DMQFNAwUBBhgAAwYBBwM0AVQDUQGiA14B0gNaAekD
|
||||
YAHoA10B0QNQAZ8DMQFNAwUBBhQAAyABLQNUAasDWwHkA0sB9QMkAfsDNgH+AzYB/gMkAfsDUwH0A2IB
|
||||
4QNRAaEDHgEqEAADIAEtA1QBqwNbAeQBRQFXAUUB9QEhAVIBIQH7ARIBUgESAf4BEgFSARIB/gEhAVIB
|
||||
IQH7AU0BUwFNAfQDYgHhA1EBoQMeASoQAAMgAS0DVAGrA1sB5AFFAlcB9QEhAlIB+wESAlIB/gESAlIB
|
||||
/gEhAlIB+wFNAlMB9ANiAeEDUQGhAx4BKhAAAyABLQNUAasDWwHkAkUBVwH1AiEBUgH7AhIBUgH+AhIB
|
||||
UgH+AiEBUgH7Ak0BUwH0A2IB4QNRAaEDHgEqDAADGwElA1gBvQNaAfIDOgH+AzAB/wM5Af8DPAH/AzYB
|
||||
/wMqAf8DJAH/A0AB/QNYAfADVgGyAxoBIwgAAxsBJQNYAb0BVQFaAVUB8gESAVoBEgH+AQABVwEAAf8B
|
||||
AAFnAQAB/wEAAWwBAAH/AQABYQEAAf8BAAFMAQAB/wEAAUABAAH/ASQBQAEkAf0BUwFdAVMB8ANWAbIB
|
||||
GQEaARkBIwgAAxsBJQNYAb0BVQJaAfIBEgJaAf4BAAJXAf8BAAJnAf8BAAJsAf8BAAJhAf8BAAJMAf8B
|
||||
AAJAAf8BJAJAAf0BUwJdAfADVgGyARkCGgEjCAADGwElA1gBvQJVAVoB8gISAVoB/gIAAVcB/wIAAWcB
|
||||
/wIAAWwB/wIAAWEB/wIAAUwB/wIAAUAB/wIkAUAB/QJTAV0B8ANWAbICGQEaASMEAAMDAQQDUgGlA14B
|
||||
8wNJAf8DVQH/A2UB/wNxAf8DdQH/A3EB/wNkAf8DTAH/AzEB/wM2Af4DXAHuA1ABmgMDAQQDAwEEAVIB
|
||||
UwFSAaUBUAFvAVAB8wEAAYIBAAH/AQABmQEAAf8BAAG2AQAB/wEAAcwBAAH/AQAB0wEAAf8BAAHLAQAB
|
||||
/wEAAbMBAAH/AQABiAEAAf8BAAFXAQAB/wESAVIBEgH+AVkBYAFZAe4DUAGaAwMBBAMDAQQBUgJTAaUB
|
||||
UAJvAfMBAAKCAf8BAAKZAf8BAAK2Af8BAALMAf8BAALTAf8BAALLAf8BAAKzAf8BAAKIAf8BAAJXAf8B
|
||||
EgJSAf4BWQJgAe4DUAGaAwMBBAMDAQQCUgFTAaUCUAFvAfMCAAGCAf8CAAGZAf8CAAG2Af8CAAHMAf8C
|
||||
AAHTAf8CAAHLAf8CAAGzAf8CAAGIAf8CAAFXAf8CEgFSAf4CWQFgAe4DUAGaAwMBBAMtAUQDYAHoA3UB
|
||||
/gNuAf8DewH/A4UB/wOKAf8DjAH/A4oB/wOFAf8DdgH/A1cB/wMyAf8DQAH9A14B3QMqAT8DLQFEAWAB
|
||||
aQFgAegBEgGQARIB/gEAAcYBAAH/AQAB3AEAAf8BAAHuAQAB/wEAAfgBAAH/AQAB+wEAAf8BAAH5AQAB
|
||||
/wEAAe8BAAH/AQAB1AEAAf8BAAGcAQAB/wEAAVoBAAH/ASQBQAEkAf0DXgHdAyoBPwMtAUQBYAJpAegB
|
||||
EgKQAf4BAALGAf8BAALcAf8BAALuAf8BAAL4Af8BAAL7Af8BAAL5Af8BAALvAf8BAALUAf8BAAKcAf8B
|
||||
AAJaAf8BJAJAAf0DXgHdAyoBPwMtAUQCYAFpAegCEgGQAf4CAAHGAf8CAAHcAf8CAAHuAf8CAAH4Af8C
|
||||
AAH7Af8CAAH5Af8CAAHvAf8CAAHUAf8CAAGcAf8CAAFaAf8CJAFAAf0DXgHdAyoBPwNOAZUDdwH4A38B
|
||||
/wOFAf8DigH/A40B/wOOAf8DjgH/A44B/wONAf8DiQH/A3cB/wNNAf8DJQH/A1oB8gNKAYsDTgGVATwB
|
||||
kgE8AfgBAAHlAQAB/wEAAe8BAAH/AQAB+AEAAf8BAAH9AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB
|
||||
/wEAAf4BAAH/AQAB9gEAAf8BAAHVAQAB/wEAAYsBAAH/AQABQQEAAf8BVQFaAVUB8gNKAYsDTgGVATwC
|
||||
kgH4AQAC5QH/AQAC7wH/AQAC+AH/AQAC/QH/AQAD/wEAA/8BAAP/AQAC/gH/AQAC9gH/AQAC1QH/AQAC
|
||||
iwH/AQACQQH/AVUCWgHyA0oBiwNOAZUCPAGSAfgCAAHlAf8CAAHvAf8CAAH4Af8CAAH9Af8CAAL/AgAC
|
||||
/wIAAv8CAAH+Af8CAAH2Af8CAAHVAf8CAAGLAf8CAAFBAf8CVQFaAfIDSgGLA18B0wN+AfwDkwH/A44B
|
||||
/wONAf8DjgH/A44B/wOOAf8DjgH/A44B/wONAf8DhQH/A2cB/wM0Af8DQQH5A1oBxAFbAV8BWwHTASsB
|
||||
vAErAfwBDgH7AQ4B/wEDAf0BAwH/AQAB/gEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB
|
||||
/wEAAf8BAAH/AQAB/QEAAf8BAAHvAQAB/wEAAbkBAAH/AQABXQEAAf8BNQFBATUB+QNaAcQBWwJfAdMB
|
||||
KwK8AfwBDgL7Af8BAwL9Af8BAAL+Af8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAAv0B/wEAAu8B/wEAArkB
|
||||
/wEAAl0B/wE1AkEB+QNaAcQCWwFfAdMCKwG8AfwCDgH7Af8CAwH9Af8CAAH+Af8CAAL/AgAC/wIAAv8C
|
||||
AAL/AgAC/wIAAf0B/wIAAe8B/wIAAbkB/wIAAV0B/wI1AUEB+QNaAcQDbgH1A4AB/gOfAf8DkwH/A48B
|
||||
/wOOAf8DjgH/A44B/wOOAf8DjgH/A44B/wOLAf8DdwH/A0gB/wNAAf0DYgHhAUoBhQFKAfUBNgHbATYB
|
||||
/gEnAf8BJwH/AQsB/wELAf8BAQH/AQEB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB
|
||||
/wEAAf8BAAH/AQAB/wEAAfkBAAH/AQAB1gEAAf8BAAGBAQAB/wEkAUABJAH9A2IB4QFKAoUB9QE2AtsB
|
||||
/gEnA/8BCwP/AQED/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAAvkB/wEAAtYB/wEAAoEB/wEkAkAB
|
||||
/QNiAeECSgGFAfUCNgHbAf4CJwL/AgsC/wIBAv8CAAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAH5Af8C
|
||||
AAHWAf8CAAGBAf8CJAFAAf0DYgHhA3UB9gOKAf4DqwH/A5kB/wOQAf8DjgH/A44B/wOOAf8DjgH/A44B
|
||||
/wOOAf8DjQH/A38B/wNVAf8DQAH9A14B4gFIAYsBSAH2AVkB2wFZAf4BQgH/AUIB/wEZAf8BGQH/AQQB
|
||||
/wEEAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH9AQAB
|
||||
/wEAAeQBAAH/AQABmAEAAf8BJAFAASQB/QNeAeIBSAKLAfYBWQLbAf4BQgP/ARkD/wEEA/8BAAP/AQAD
|
||||
/wEAA/8BAAP/AQAD/wEAA/8BAAL9Af8BAALkAf8BAAKYAf8BJAJAAf0DXgHiAkgBiwH2AlkB2wH+AkIC
|
||||
/wIZAv8CBAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAB/QH/AgAB5AH/AgABmAH/AiQBQAH9A14B
|
||||
4gNhAdYDjAH8A7gB/wOjAf8DkwH/A44B/wOOAf8DjgH/A44B/wOOAf8DjgH/A40B/wOCAf8DXAH/A00B
|
||||
+gNaAccBXAFhAVwB1gFkAcABZAH8AV8B/wFfAf8BLwH/AS8B/wEMAf8BDAH/AQEB/wEBAf8BAAH/AQAB
|
||||
/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/gEAAf8BAAHqAQAB/wEAAaUBAAH/ASYB
|
||||
TQEmAfoDWgHHAVwCYQHWAWQCwAH8AV8D/wEvA/8BDAP/AQED/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAC
|
||||
/gH/AQAC6gH/AQACpQH/ASYCTQH6A1oBxwJcAWEB1gJkAcAB/AJfAv8CLwL/AgwC/wIBAv8CAAL/AgAC
|
||||
/wIAAv8CAAL/AgAC/wIAAf4B/wIAAeoB/wIAAaUB/wImAU0B+gNaAccDUAGaA44B+QPFAf8DsgH/A5wB
|
||||
/wORAf8DjgH/A44B/wOOAf8DjgH/A48B/wOOAf8DgwH/A2AB/wNaAfIDTAGQA1ABmgFqAaUBagH5AXwB
|
||||
/wF8Af8BUQH/AVEB/wEfAf8BHwH/AQcB/wEHAf8BAQH/AQEB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB
|
||||
/wECAf8BAgH/AQIB/gECAf8BAAHrAQAB/wEAAa0BAAH/AVUBawFVAfIDTAGQA1ABmgFqAqUB+QF8A/8B
|
||||
UQP/AR8D/wEHA/8BAQP/AQAD/wEAA/8BAAP/AQID/wECAv4B/wEAAusB/wEAAq0B/wFVAmsB8gNMAZAD
|
||||
UAGaAmoBpQH5AnwC/wJRAv8CHwL/AgcC/wIBAv8CAAL/AgAC/wIAAv8CAgL/AgIB/gH/AgAB6wH/AgAB
|
||||
rQH/AlUBawHyA0wBkAMvAUkDbAHrA6wB/gPGAf8DrgH/A5wB/wOTAf8DkAH/A48B/wOQAf8DkwH/A5MB
|
||||
/wOFAf8DVAH9A2AB4AMtAUUDLwFJAWwBbQFsAesBgAHbAYAB/gF/Af8BfwH/AUkB/wFJAf8BHwH/AR8B
|
||||
/wEMAf8BDAH/AQUB/wEFAf8BAwH/AQMB/wEFAf8BBQH/AQoB/wEKAf8BCgH+AQoB/wEBAe0BAQH/ASQB
|
||||
tgEkAf0BYAFmAWAB4AMtAUUDLwFJAWwCbQHrAYAC2wH+AX8D/wFJA/8BHwP/AQwD/wEFA/8BAwP/AQUD
|
||||
/wEKA/8BCgL+Af8BAQLtAf8BJAK2Af0BYAJmAeADLQFFAy8BSQJsAW0B6wKAAdsB/gJ/Av8CSQL/Ah8C
|
||||
/wIMAv8CBQL/AgMC/wIFAv8CCgL/AgoB/gH/AgEB7QH/AiQBtgH9AmABZgHgAy0BRQMDAQQDVgGuA38B
|
||||
9QPZAf8DywH/A7cB/wOnAf8DnQH/A5oB/wOcAf8DnwH/A5sB/wOJAf8DaAHwA1IBowMDAQQDAwEEA1YB
|
||||
rgFwAYUBcAH1AagB/wGoAf8BiQH/AYkB/wFcAf8BXAH/ATcB/wE3Af8BIgH/ASIB/wEbAf8BGwH/AR8B
|
||||
/wEfAf8BJgH/ASYB/wEdAf8BHQH/AQUB8wEFAf8BUwFsAVMB8ANSAaMDAwEEAwMBBANWAa4BcAKFAfUB
|
||||
qAP/AYkD/wFcA/8BNwP/ASID/wEbA/8BHwP/ASYD/wEdA/8BBQLzAf8BUwJsAfADUgGjAwMBBAMDAQQD
|
||||
VgGuAnABhQH1AqgC/wKJAv8CXAL/AjcC/wIiAv8CGwL/Ah8C/wImAv8CHQL/AgUB8wH/AlMBbAHwA1IB
|
||||
owMDAQQEAAMcAScDXQHHA38B9gO7Af4D1wH/A8wB/wPCAf8DuwH/A7cB/wOxAf8DgAH+A2sB9ANZAbwD
|
||||
GwEmCAADHAEnA10BxwF4AYsBeAH2AZMB2wGTAf4BpQH/AaUB/wGLAf8BiwH/AXQB/wF0Af8BZgH/AWYB
|
||||
/wFcAf8BXAH/AU4B/wFOAf8BQgHbAUIB/gFQAX8BUAH0AVcBWQFXAbwDGwEmCAADHAEnA10BxwF4AosB
|
||||
9gGTAtsB/gGlA/8BiwP/AXQD/wFmA/8BXAP/AU4D/wFCAtsB/gFQAn8B9AFXAlkBvAMbASYIAAMcAScD
|
||||
XQHHAngBiwH2ApMB2wH+AqUC/wKLAv8CdAL/AmYC/wJcAv8CTgL/AkIB2wH+AlABfwH0AlcBWQG8AxsB
|
||||
JgwAAyEBMANZAbYDbQHuA6EB+gO+Af0D1AH/A8wB/wO+Af0DigH5A2wB6wNVAawDHwEsEAADIQEwA1kB
|
||||
tgFrAW8BawHuAYoBqwGKAfoBrgHJAa4B/QGfAf8BnwH/AYwB/wGMAf8BZAHJAWQB/QFoAaUBaAH5AWEB
|
||||
bQFhAesDVQGsAx8BLBAAAyEBMANZAbYBawJvAe4BigKrAfoBrgLJAf0BnwP/AYwD/wFkAskB/QFoAqUB
|
||||
+QFhAm0B6wNVAawDHwEsEAADIQEwA1kBtgJrAW8B7gKKAasB+gKuAckB/QKfAv8CjAL/AmQByQH9AmgB
|
||||
pQH5AmEBbQHrA1UBrAMfASwUAAMGAQcDNgFYA1UBrANmAeUDrwH8A5kB+wNlAeIDUwGnAzMBUQMGAQcY
|
||||
AAMGAQcDNgFYA1UBrAFmAWcBZgHlAX4BwAF+AfwBeQG2AXkB+wNlAeIDUwGnAzMBUQMGAQcYAAMGAQcD
|
||||
NgFYA1UBrAFmAmcB5QF+AsAB/AF5ArYB+wNlAeIDUwGnAzMBUQMGAQcYAAMGAQcDNgFYA1UBrAJmAWcB
|
||||
5QJ+AcAB/AJ5AbYB+wNlAeIDUwGnAzMBUQMGAQcMAAFCAU0BPgcAAT4DAAEoAwABQAMAASADAAEBAQAB
|
||||
AQYAAQEWAAP/gQAB4AEHAeABBwHgAQcB4AEHAcABAwHAAQMBwAEDAcABAwGAAQEBgAEBAYABAQGAAQFQ
|
||||
AAGAAQEBgAEBAYABAQGAAQEBwAEDAcABAwHAAQMBwAEDAeABBwHgAQcB4AEHAeABBws=
|
||||
</value>
|
||||
</data>
|
||||
<metadata name="ilGames.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>24, 73</value>
|
||||
</metadata>
|
||||
<data name="ilGames.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>
|
||||
AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs
|
||||
LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu
|
||||
SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAoh8AAAJNU0Z0AUkBTAIBAQIB
|
||||
AAFQAQEBUAEBASABAAEgAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABgAMAASADAAEBAQABIAYAAUB6
|
||||
AANcAecBCAEKAQAB/wMqAUAMAAMqAUADNgFXAz8BbAM/AWwDPwFsAz8BbAM/AWwDPwFsAz8BbAM/AWwD
|
||||
PwFsAz8BbAM/AWwDPwFsAz8BbAM/AWwDPwFsAz8BbAI7AToBYgMzAVEDGAEh/wB1AAMhATADRgGAFAAB
|
||||
FQEfAQQB/wENARUBAAH/AQgBCgEAAf8BCAEKAQAB/wwAA0QBegNTAacCYQFdAc8CYQFdAc8CYQFdAc8C
|
||||
YQFdAc8CYQFdAc8CYQFdAc8CYQFdAc8CYQFdAc8CYQFdAc8CYQFdAc8CYQFdAc8CYQFdAc8CYQFdAc8C
|
||||
YQFdAc8CYQFdAc8CYAFdAc4DWQG7AlABTwGbAyoBQP8AaQADWgG/AQgBCgEAAf8BCAEKAQAB/wEIAQoB
|
||||
AAH/AQgBCgEAAf8BCAEKAQAB/wEIAQoBAAH/AQgBCgEAAf8DWgG/A1oBvwFDAXQBBwH/AUcBdwEMAf8B
|
||||
JQFHAQAB/wEOARkBAAH/DAACSwFKAYoCWgFYAb0CZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoC
|
||||
ZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoC
|
||||
YwFaAekCXwFbAdMDVQGvAy4BSP8AZQABCAEKAQAB/wEQAR4BAAH/ASEBQQEAAf8BJwFLAQAB/wEmAUoB
|
||||
AAH/ASEBQQEAAf8BEAEeAQAB/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB/wEpAU4BAAH/AVoBlgEQAf8B
|
||||
WgGcARAB/wFzAbYBJgH/ARgBLgEAAf8MAANJAYYCWgFYAbcCZQFgAeMCZQFgAeMCZQFgAeMCZQFgAeMC
|
||||
agFhAeYCagFeAe0BdAFoAVMB9AGuAXcBKwH8Af8BeAEAAv8BeAEAAf8BcAFuAU8B9QJqAWEB5gJlAWAB
|
||||
4wJlAWAB4wJlAWAB4wJlAV4B4gJeAVsBzQJVAVMBqgIuAS0BRv8AYQABCAEKAQAB/wE9AXEBAgH/AUwB
|
||||
hgEHAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBEAH/AUwBfwEPAf8BOwFnAQgB
|
||||
/wEhATQBCAH/AVMBjgELAf8BWgGcARAB/wFyAbMBJwH/AVMBgQEbAf8QAAMrAUEDNgFZAkABPwFuAkAB
|
||||
PwFuAkABPwFuAkABPwFuA0QBewJRAVABnwJdAVsBxQFmAmIB7gH/AXgBAAL/AXgBAAH/Al8BXQHJA0UB
|
||||
fAJAAT8BbgJAAT8BbgJAAT8BbgM/AW0DOwFjAzMBUgMZASL/AF0AARUBKQEAAf8BSgGEAQQB/wFSAYwB
|
||||
CAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMARAB/wFSAYwBEAH/AVIBjAEQAf8B
|
||||
WgGUARAB/wFWAZABDAH/AVoBmgEQAf8BWgGcARAB/wFyAakBMAH/AQgBCgEAAf8BCAEKAQAB/wwAAwwB
|
||||
EAMRARYDFQEcAxUBHAMVARwDFQEcAyEBMAI+AT0BaQJTAVIBpQJmAV8B5QH/AXgBAAL/AXgBAAH/AlUB
|
||||
UwGqAyIBMQMVARwDFQEcAxUBHAMUARsDEwEZAxABFQMHAQn/AFkAARYBJwECAf8BSQGAAQcB/wFSAYwB
|
||||
CAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQsB/wFSAYwBEAH/AVIBjAEQAf8B
|
||||
WAGSARAB/wFaAZQBEAH/AVoBmwEQAf8BWgGcARAB/wFcAZ4BEgH/ATsBbQEDAf8BCAEKAQAB/wEIAQoB
|
||||
AAH/AQgBCgEAAf8IAAMFBAYECAEKAwgBCgMIAQoDCAEKAxcBHwI5ATgBXQNRAZ4CZQFgAeMB/wF4AQAC
|
||||
/wF4AQAB/wNSAaMDGAEhAwgBCgMIAQoDCAEKAwgBCgMHAQkDBgEHAwIBA/8AVQADXQHfAUcBgAEDAf8B
|
||||
UgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMARAB/wFSAYwB
|
||||
EAH/AVIBjAEQAf8BWgGUARAB/wFaAZQBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBnAEQAf8B
|
||||
WgGYARAB/wEWASoBAAH/AQgBCgEAAf8BCAEKAQAB/xwAAxIBFwM1AVYDUAGaA2IB4QH/AXgBAAL/AXgB
|
||||
AAH/AlEBUAGfAxIBGP8AcQABLAFQAQAB/wFKAYwBAAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIB
|
||||
jAEIAf8BUgGMAQgB/wFSAYwBDgH/AVUBkgEQAf8BWgGcARAB/wFaAZwBEAH/AVoBlAEQAf8BWgGcARAB
|
||||
/wFaAZwBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBlAEYAf8BWAGSARYB/wEQAR4BAAH/AQgB
|
||||
CgEAAf8cAAMSARcDNQFWA1ABmgNiAeEB/wF4AQAC/wF4AQAB/wJRAVABnwMSARj/AHUAA0sBjwEzAV4B
|
||||
AAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEQAf8BfwHAATMB/wFfAZ4BFwH/ASABPwEAAf8B
|
||||
CAEKAQAB/wFSAYwBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGVARcB/wFaAZQB
|
||||
GAH/AVoBlAEYAf8BWgGUARgB/wEIAQoBAAH/AQgBCgEAAf8YAAMSARcDNQFWA1ABmgNiAeEB/wF4AQAC
|
||||
/wF4AQAB/wJRAVABnwMSARgUAAQBAwMBBAMGBAcBCQMHAQkDBAEFBAIEAf8ATQABQgF7AQAB/wFSAYwB
|
||||
CAH/AXsBxgEpAf8DMwFQBAADDAEQATkBawEAAf8BWgGcARAB/wFaAZwBEAH/AV0BlwETAf8BVgGUAQwB
|
||||
/wFaAZwBEAH/AVoBlAEYAf8BWgGUARgB/wFjAZwBGAH/AWMBpQEXAf8BKQFQAQAB/wEIAQoBAAH/GAAD
|
||||
EgEXAzUBVgNQAZoDYgHhAf8BeAEAAv8BeAEAAf8CUQFQAZ8DEgEYFAAEAgMJAQwDDwEUAxMBGgMSARgD
|
||||
CgENAwQBBQQB/wBRAAEIAQoBAAH/DAABEwEjAQAB/wFaAZQBEAH/AVoBnAEQAf8BlAHWAUoB/wENAREB
|
||||
AgH/ATEBWgEAAf8BWgGUARIB/wFaAZQBGAH/AVoBlAEYAf8BYwGcARgB/wFjAaUBFwH/AWsBpQEhAf8B
|
||||
EAEeAQAB/xgAAxIBFwM1AVYDUAGaA2IB4QH/AXgBAAL/AXgBAAH/AlEBUAGfAxIBGBQAAwUBBgMdASkD
|
||||
MAFKAjsBPAFlAjsBPAFkAygBPAIVARYBHQMGAQj/AD0AA10B3wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB
|
||||
/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB/wMzAVADOgFgAUsBhQEHAf8BWgGUARAB/wFaAZwBEAH/ATkB
|
||||
awEAAf8DCQEMARABHgEAAf8BVAGOARIB/wFaAZQBGAH/AWMBnAEYAf8BYwGcARgB/wFjAaUBFwH/AXMB
|
||||
tAEpAf8BEAEeAQAB/xgAAxIBFwM1AVYDUAGaA2IB4QH/AXgBAAL/AXgBAAH/AlEBUAGfAxIBGBQAAwkB
|
||||
DAMzAVACTAFNAZECXQFfAckCWwFdAcoDRAF6AykBPQMMARD/ADkAAQgBCgEAAf8BCAEKAQAB/wEIAQoB
|
||||
AAH/AQgBCgEAAf8BCAEKAQAB/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB/wEIAQoBAAH/ATMBXwECAf8B
|
||||
WgGUARAB/wFaAZwBEAH/Aa0B5wFjAf8BEAEeAQAB/wEIAQoBAAH/ARQBJgEAAf8BVAGOARIB/wFiAZsB
|
||||
GAH/AWMBnAEYAf8BYwGlARcB/wFjAaUBFwH/AWMBnAEhAf8BGAEuAQAB/xgAAxIBFwM1AVYDUAGaA2IB
|
||||
4QH/AXgBAAL/AXgBAAH/AlEBUAGfAxIBGBQAAwkBCwMuAUcDSAGEAlkBXAHDAlwBXwHLA0kBhQMuAUcD
|
||||
DwET/wA1AAEIAQoBAAH/ASsBUgEAAf8BQQFyAQUB/wFKAYQBBgH/AUoBhAEGAf8BSgGEAQYB/wFCAXMB
|
||||
BgH/ASkBUAEAAf8BEAEeAQAB/wEfAToBAAH/AVUBjwELAf8BWgGVARAB/wFaAZwBEAH/AdYB/wGMAf8B
|
||||
EAEeAQAB/wEYAS4BAAH/AUIBeAEDAf8BWgGUARgB/wFiAZsBGAH/AWMBnAEYAf8BYwGlARcB/wFjAaUB
|
||||
FwH/AXMBtAEpAf8BEAEeAQAB/xgAAxIBFwM1AVYDUAGaA2IB4QH/AXgBAAL/AXgBAAH/AlEBUAGfAxIB
|
||||
GBQAAwYBCAMkATQDPAFmA1MBpwNYAbgCRwFIAYMDMQFNAw8BFP8AMQABKAFNAQAB/wFOAYgBBwH/AVIB
|
||||
jAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEQAf8BUgGMARAB
|
||||
/wFSAYwBEAH/AVoBlAEQAf8BWgGcARAB/wFjAaUBFwH/AUIBewEAAf8BSgGEAQYB/wFSAYwBCAH/AVoB
|
||||
mAEUAf8BWgGUARgB/wFjAZwBGAH/AWMBpQEXAf8BYwGlARcB/wFjAaUBFwH/AZQByQFNAf8EAAMQARUD
|
||||
GgEkAyEBLwMRARYEAgQBAxIBFwM1AVYDUAGaA2IB4QH/AXgBAAL/AXgBAAH/AlEBUAGfAxIBGBQAAwMB
|
||||
BAMTARkDJQE2AjsBPAFkAkEBQgFyAzMBUQMhAS8DCQEM/wAtAAEpAU4BAgH/AVIBjAEIAf8BUgGMAQgB
|
||||
/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMARAB/wFSAYwBEAH/AVIB
|
||||
jAEQAf8BWgGUARAB/wFaAZUBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGUARgB
|
||||
/wFaAZQBGAH/AWMBnAEYAf8BYwGcARgB/wFjAaUBFwH/AWMBpQEXAf8BYwGlARcB/wFlAaABIQH/BAAD
|
||||
HgErAjEBMAFMAzsBYwMiATEDBwEJAwQBBQMSARgDNgFXA1ABmgNiAeEB/wF4AQAC/wF4AQAB/wJRAVAB
|
||||
nwMSARgcAAMHAQkDHAEnAyMBMgIZARoBIwMPARQDBAEF/wApAANGAYABTgGIAQcB/wFSAYwBCAH/AVIB
|
||||
jAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEQAf8BUgGMARAB
|
||||
/wFSAYwBEAH/AVoBlAEQAf8BWgGXARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEAH/AVoB
|
||||
lAEYAf8BWgGUARgB/wFjAZwBGAH/AWMBoQEYAf8BYwGlARcB/wFjAaUBFwH/AXgBugEsAf8BCAEKAQAB
|
||||
/wQAAyQBNANFAXwCWgFYAbcDTgGUAz8BbQMoATsDHwEsAzkBXgNQAZoDYgHhAf8BeAEAAv8BeAEAAf8C
|
||||
UQFQAZ8DEgEYHAADEgEXAzwBZgNKAYkDQAFvAy4BRwMOARL/ACkAATUBXgEHAf8BUgGMAQgB/wFSAYwB
|
||||
CAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEQAf8B
|
||||
UgGMARAB/wFaAZQBEAH/AVoBlAEQAf8BWgGbARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZYB
|
||||
FgH/AVoBlAEYAf8BXQGXARgB/wFjAZwBGAH/AWMBpQEXAf8BYwGlARcB/wFwAbMBIAH/ASsBUAEEAf8I
|
||||
AAMnAToCUwFRAaIBmwFfASEB+wJlAVwB5wJcAVoBxAJDAUIBdQMxAU0CQAE/AW4CUQFQAZ8CZQFgAeMB
|
||||
/wF4AQAC/wF4AQAB/wJRAVABnwMSARgcAAMZASIDTgGVAlsBXgHNAlYBVwGyA0QBegMdASkDBgEIBAIE
|
||||
Af8AHQABSgGEAQYB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BZwGpARcB
|
||||
/wFSAYwBCAH/AUoBhAEGAf8BSgGEAQYB/wFSAYwBEAH/AVoBlAEQAf8BWgGXARAB/wFaAZwBEAH/AVoB
|
||||
nAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBlAEYAf8BWgGUARgB/wFfAZgBGAH/AWMBngEYAf8BYwGlARcB
|
||||
/wFrAakBHQH/ASkBUAEAAf8MAAMiATEDTgGYAm8BWwHzAmgBXQHwAmoBYQHmAloBVwHCAlUBUwGqA1MB
|
||||
pwJZAVcBvAJsAWEB6wH/AXgBAAL/AXgBAAH/AlEBUAGfAxIBGBwAAxQBGwJDAUQBdwJWAVkBtgJbAV4B
|
||||
zQJWAVgBswM/AWwDJgE4AwwBDwMCAQP/AB0AAUoBhAEGAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8B
|
||||
UgGMAQgB/wFpAaQBHgH/ASwBUAEDAf8BCAEKAQAB/wE3AWEBBwH/AVIBjAEOAf8BUgGMARAB/wF/AcEB
|
||||
MgH/AVsBXgFbAdMDWgG/AS8BWQEAAf8BRAF6AQUB/wFQAYoBCAH/AVoBnAEOAf8BWgGcARAB/wFaAZwB
|
||||
EAH/AU8BhgEQAf8BRAF0AQwB/wNaAb8QAAIaARkBIwNEAXsCXQFbAcoCYwFfAdoCaQFgAegCZwFZAe8B
|
||||
ZgFlAV0B7AJhAVwB1gJfAVsB2AF0AWgBUwH0Af8BeAEAAv8BeAEAAf8CUQFQAZ8DEgEYHAADDwETAzQB
|
||||
UwNNAZICXQFhAc8CXQFhAdQCUgFUAagCQQFCAXIDJgE4AxQBGwMGAQgDAgED/wAVAAFKAYwBAAH/AVIB
|
||||
jAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BZwGdAScB/wEIAQoBAAH/AQoBDwEAAf8BQgF3AQMB
|
||||
/wFSAYwBEAH/AVoBnAEQAf8BJQFBAQUB/wQAAzoBYAEIAQoBAAH/AQgBCgEAAf8EAANGAYADRgGAA0YB
|
||||
gBwAAwoBDQMiATEDNAFUA0QBeAJRAVABnwJhAV0BzwJqAV4B7QFmAWUBXQHsAmgBXQHwAZsBXwEhAfsB
|
||||
/wF4AQAC/wF4AQAB/wJRAVABnwMSARgcAAMGAQgDGAEhAzEBTQJMAU0BkQJYAVoBvQJdAWEB0QJZAVwB
|
||||
wwJRAVMBogM9AWcCGQEaASMDDAEP/wAVAAE7AW0BAgH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIB
|
||||
jAEIAf8BUwGOARAB/wEPARsBAAH/ASMBQwEAAf8BUgGMARAB/wFSAYwBEAH/AXsBvQEwAf8BCAEKAQAB
|
||||
/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB/ygAAwMBBAMJAQsD
|
||||
IgExAzgBWwJPAU4BlwJfAVwByAJmAV8B5QGGAW8BUQH3Ab4BXQE2Af0B/wF4AQAC/wF4AQAB/wJRAVAB
|
||||
nwMSARgcAAQBAwIBAwMVARwDNQFWAksBTAGPAlwBXwHIAl0BYwHfAmABZQHjAlIBUwGlAzQBUwMcASf/
|
||||
ABUAAQgBCgEAAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AU4BggEPAf8B
|
||||
SgGEAQYB/wFSAYwBEAH/AWMBpQEXAf8BCAEKAQAB/wEIAQoBAAH/ARMBIwEAAf8BQgFzAQYB/wEgAT8B
|
||||
AAH/AQgBCgEAAf8BCAEKAQAB/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB/yAABAEDAwEEAwwBEAMYASAD
|
||||
KQE9Az4BagJXAVYBtQJmAV8B5QGGAW8BUQH3Af8BeAEAAv8BeAEAAf8CUQFQAZ8DEgEYIAAEAQMHAQkD
|
||||
FAEbAyoBQANDAXYDVQGvAloBYwHpAlsBXwHQAlABUQGfAzMBUf8AGQABQgFzAQYB/wFSAYwBCAH/AVIB
|
||||
jAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMARAB/wFSAYwBEAH/AUoBhAEGAf8BEAEeAQAB
|
||||
/wExAVoBAAH/AU0BhAENAf8BWgGcARAB/wFaAZwBEAH/AVIBjAEIAf8BEAEeAQAB/wEIAQoBAAH/AQgB
|
||||
CgEAAf8DRgGALAADAgEDAwsBDgMgAS4DQwF2AlcBVQGxAmYBYAHgAXcBYwFIAfYBjgFqAUEB+QJRAVAB
|
||||
nAMSARcMAAQBAwwBEAMXAR8DHQEoAx0BKAMMAQ8IAAMPARQCJgEnATkCRwFIAYMDYgHhAlwBZQHnA14B
|
||||
0gI/AUABbv8AHQABSQGJAQAB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEQAf8B
|
||||
UgGMARAB/wFSAYwBEAH/AVIBjAEQAf8BWgGUARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwB
|
||||
EAH/AVoBlAEYAf8BQgFzAQYB/wEKAQ4BAAH/MAAEAQMDAQQDDAEPAx4BKgM6AWECWQFXAbkCYwFbAeQB
|
||||
ZgJiAe4CTwFOAZcDEgEXDAADAgEDAyEBLwM2AVkCQgFDAXUCQQFCAXMDHgErCAADBAEFAwwBDwM4AVwC
|
||||
XQFgAc4CXQFmAewCWQFnAe8DRgF//wAhAAE6AWsBAAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIB
|
||||
jAEQAf8BUgGMARAB/wFaAZQBEAH/AVoBlAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGcARAB
|
||||
/wFaAZQBGAH/AVoBlAEYAf8BYwGlARcB/wEZASwBAwH/OAADAgEDAwgBCgMgAS0CQQFAAXECTQFMAZED
|
||||
UAGaAjsBOgFiAwwBDwwAAwMBBAMrAUEDRAF6A1MBpwNVAa0DNwFaAxgBIAMJAQsDBgEHAw0BEQM5AV8C
|
||||
XQFhAdECWQFnAe8CWwFvAfMCRgFHAYH/ACUAASwBVQEAAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEQAf8B
|
||||
UgGMARAB/wFaAZQBEAH/AVoBlAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZQB
|
||||
GAH/AVoBlAEYAf8BIQFBAQAB/0AABAIDBwEJAxAEFQEcAhYBFQEdAw8BEwMCAQMMAAMDAQQDMANLAUwB
|
||||
jwJbAV0BygJbAWEB3gNOAZQDNAFTAxUBHAMNAREDHgErAkMBRAF3Al0BYwHfAmEBcAHxAloBYwHpA0QB
|
||||
e/8AIQABEgEiAQAB/wFMAYYBBgH/AVIBjAEIAf8BWgGcARAB/wFQAYoBCAH/AVIBjAEQAf8BWgGUARAB
|
||||
/wFaAZwBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBnAERAf8BaQGrAR8B/wEIAQoBAAH/bAAD
|
||||
AgEDAyEBLwM6AWEDVQGtAl8BYwHaA1oBvwJQAVEBnwNEAXoCQQFCAXIDSQGFAlYBVwGyAl4BagHtAmAB
|
||||
ZAHbAlUBVwGxAzgBW/8AIQABEAEeAQAB/wFIAX0BBwH/AVkBkwETAf8BVQGIARgB/wgAASEBQQEAAf8B
|
||||
QgF7AQAB/wFSAYwBCAH/AVUBkQEIAf8BOQFmAQQB/wNZAe94AAMGAQgDFwEfA0QBewJZAVwBxgJbAWMB
|
||||
5AJTAXQB9AJiAWYB7gJiAWYB7gJhAXAB8QJIAXcB9gIrAa4B/AJZAVwBvgM+AWsDJAE0/wApAAEeAToB
|
||||
AAH/nAAEAgMJAQwDKgM/AUABbgNOAZYCVgFYAbMCWQFcAcECWgFdAccCWgFdAccCVwFZAbkCUQFSAaQC
|
||||
QAFBAXEDJQE2AxMBGf8A0QAEAQMLAQ4DJgE4AzkBXgNGAX0CSgFLAYsDSgGJAz4BawMqAT8DFwEfAwIB
|
||||
A/8ABQABQgFNAT4HAAE+AwABKAMAAYADAAEgAwABAQEAAQEGAAECFgAD/wEAA/8BxwIAAQcB/wgAAv8B
|
||||
zwGHAgABBwH/CAAB/wH+AQABBwIAAQcB/wgAAf8B/AEAAQcCAAEHAf8IAAH/AfgBAAEPAgABBwH/CAAB
|
||||
/wHwAQABBwIAAQcB/wgAAf8B4AEAAQMCAAEHAf8IAAH/AcABAAEBAfwBAwL/CAAB/wHAAQABAQH8AQMC
|
||||
/wgAAf8B4AIAAfwBAwHgAR8IAAH/AfwBIAEAAfwBAwHgAR8IAAH/Af4B4AEAAfwBAwHgAR8IAAH/AcAC
|
||||
AAH8AQMB4AEfCAAB/wGAAgAB/AEDAeABHwgAAf8DAAH8AQMB4AEfCAAB/gIAAQEBAAEDAeABHwgAAfwC
|
||||
AAEBAQABAwH4AR8IAAH4AgABAQEAAQMB+AEfCAAB+AIAAQMBAAEDAfgBAwgAAfgCAAEHAQABAwH4AQMI
|
||||
AAH4AgABDwEAAQMB+AkAAfgBAAFEAX8BAAEDAfgJAAH4AQABAQH/AYABAwH4CQAB+AIAAX8BgAEDAfwJ
|
||||
AAH8AgABfwHwAQMBgQGACAAB/gIAAf8B8AEDAYEBgAgAAf8CAAH/AfwBAwGACQAB/wGAAQEB/wH+AQMB
|
||||
gAkAAf8BAAEDA/8BgAkAAf8BDAEPA/8BwAkAAf8B3wT/AcAJAAb/AfABAQgACw==
|
||||
</value>
|
||||
</data>
|
||||
<metadata name="ilTabIcons.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>20, 44</value>
|
||||
</metadata>
|
||||
<data name="ilTabIcons.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>
|
||||
AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs
|
||||
LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu
|
||||
SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAuhIAAAJNU0Z0AUkBTAIBAQQB
|
||||
AAFQAQIBUAECARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMAASADAAEBAQABIAYAASD/
|
||||
AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/ACIAA2cB7wJnAVkB7wFnAV0BWQHvAWcBWwFZAe8B
|
||||
ZwFbAVkB7wFnAlkB7wFnAWQBWQHvA2cB7wNnAe8DZwHvA2cB7wNnAe8DZwHvA2cB7wNnAe8DZwHvAwcB
|
||||
CQMqAT8DRQF8A1kBuwNjAd8DaAH0A4AB/gOBAf8DgQH/A4EB/wOAAf4DaAH0A2MB3wNaAboDRAF6AycB
|
||||
OjgAAzMBUQNuAfUIAAM3AVoDWAG4A2MB3wJjAV0B3wFiAl0B3wNdAd8DXQHfAWECXQHfA2MB3wNjAd8D
|
||||
VQGsAzABSwgAA/gB/wG5AZUBPAH/AYMBfQFuAf8BhAF9AWwB/wGqAYQBJwH/AawBewEAAf8BzAG8AZQB
|
||||
/wN+Af8DfgH/A34B/wN+Af8DfgH/A34B/wN+Af8DfgH/A44B/wNDAXUDXQHMA3wB+AOBAf8DgQH/A4EB
|
||||
/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A3wB+ANUAag4AAMSARgDPwFtBAADOwFiA10B
|
||||
xQNoAfQBnwFlATEB/wGXAVMBFwH/AZYBSwEJAf8BkwFGAQEB/wGMAUMBAwH/AX0BQAELAf8BawFAARoB
|
||||
/wFuAVABNgH/A2gB8ANaAbcDNAFUBAAE/wGXAYsBbQH/AoEBgAH/AYIBgQGAAf8BmAGIAWAB/wHKAZAB
|
||||
AAH/Ad0BzAGfAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOTAf8DagHtA30B+gOBAf8D
|
||||
gQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DVQGvNAADXwHTAz0B
|
||||
ZwQAAzUBVQNdAccCbgFaAfUBuAFlARsB/wG5AVgBAgH/AckBXwEAAf8B2AFlAQAB/wHcAWcBAAH/AdYB
|
||||
ZAEAAf8BwwFcAQAB/wGiAUwBAAH/AXwBOwEDAf8BbgFGASMB/wNoAfADWgG3AzABSgT/AYYBhAF9Af8D
|
||||
gQH/A4EB/wGHAYMBegH/Ac8BlAEAAf8B3gHMAZ8B/wPgAf8D4AH/A+AB/wPgAf8D4AH/A+AB/wPgAf8D
|
||||
4AH/A7wB/wNjAd8DbgH1A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8D
|
||||
gQH/A4EB/wNVAa80AANaAcIDNAFTBAADXAHEAnwBXAH4AdQBcQEYAf8B1wFlAQAB/wHlAWwBAAH/AfIB
|
||||
cgEAAf8B+gF1AQAB/wH8AXYBAAH/AfoBdgEAAf8B8wFyAQAB/wHiAWsBAAH/Ab0BWQEAAf8BhwFAAQAB
|
||||
/wFxAUgBIwH/A2gB8ANWAasE/wGLAYYBegH/A4EB/wOBAf8BjgGGAXEB/wHPAZQBAAH/Ad4BzAGfIf8D
|
||||
ygH/AzYBWANbAcADbgH1A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8D
|
||||
aAH0A1IBpBAAAw0BEQM/AWwDUwGnAVwCWQG+AVgCVgGzAUgCRwGDAyEBMAQAA28B8wM6AWAIAAH+Ad0B
|
||||
wQH/Ae0BgAEgAf8B7QFxAQIB/wHzAXMBAAH/AfoBdgEAAf8B/gF4AQAC/wF7AQgC/wGIAScC/wGiAVMB
|
||||
/wH+AYEBFwH/AfwBeAEEAf8B7AFvAQAB/wHBAVsBAAH/AYYBQQEDAf8BeAFWATYB/wNjAd8E/wGsAZYB
|
||||
YAH/AYMBggF/Af8BhQGCAX0B/wGzAZMBRAH/Ac8BlAEAAf8B3gHMAZ8B/wOwAf8DsAH/A7AB/wOwAf8D
|
||||
sAH/A7AB/wOwAf8DsAH/A6gB/wMCAQMDGgEjAzgBXANUAagDYgHXA3AB8QOAAf4DgQH/A4EB/wOBAf8D
|
||||
gQH9A2gB8ANhAdQDUwGlAzYBWQMYASAIAAMaASQDUgGgAmMBSAH2AaIBcwEAAf8BrgF8AQAB/wGwAX0B
|
||||
AAH/AagBeAEAAf8BlQFqAQAB/wKAAUoB/gFcAlkBxgNXAbUDFgEeCAAB/wGyAW8B/wH9AYABEQH/AfwB
|
||||
dwEBAf8B/QF3AQAC/wF4AQAC/wF/AQ8C/wGSATsC/wGzAYMC/wHqAeAC/wGQAT0C/wF7AQoB/wH8AXcB
|
||||
AAH/AeUBbAEAAf8BsQFUAQAB/wGEAUsBGgH/A2MB3wT/AdkBqgE3Af8BvgGYATgB/wHAAZgBNgH/AdwB
|
||||
ogEUAf8BzwGUAQAB/wHeAcwBnwH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DkwH/RAAD
|
||||
IAEtAmMBWgHpAb8BiAEAAf8BzQGVAQoB/wGwAYgBJwH/AXMBZAE/Af8BTQFLAUcB/wFOAUsBQgH/AWYB
|
||||
VwExAf8BmgF0ARcB/wGkAXYBAwH/AXABTwEAAf8DQwF2BAEEAAH/AZoBQgL/AYMBFQH/Af4BegEEAv8B
|
||||
eAEAAv8BeAEAAv8BlQE/Av8BygGuAv8B2gHGAv8B7QHlAv8BlgFJAv8BfAENAf8B/gF4AQAB/wH0AXMB
|
||||
AAH/AdABYgEAAf8BmgFOAQoB/wFjAl0B3wT/AeEBrgExAf8BvQGXATsB/wHAAZgBNQH/AeMBpQEKAf8B
|
||||
zwGUAQAB/wHeAcwBnwH/A8AB/wPAAf8DwAH/A8AB/wPAAf8DwAH/A8AB/wPAAf8DrwH/CAADAgEDAwgB
|
||||
CgMhAS8DMQFOAz0BaANDAXYDRAF6A0MBdQM9AWcDMQFNAyABLgMHAQkEAggAAmMBWgHpAdkBmgEAAf8B
|
||||
2gGjARwB/wKOAYwB/wOKAf8DlwH/A5sB/wORAf8DdAH/A0gB/wFDAUIBPwH/AbUBgwEHAf8BegFXAQAB
|
||||
/wM2AVgEAAH/AZUBNwL/AYkBHwL/AX0BCAL/AXgBAAL/AXgBAAL/AagBXAL/AeABzQL/AaEBZgL/AdgB
|
||||
xQL/AbkBlAL/AYcBIwL/AXgBAAH/AfsBdgEAAf8B4gFqAQAB/wGvAVQBAwH/AWMCXQHfBP8BuwGdAVMB
|
||||
/wGIAYQBeQH/AYwBhQF0Af8BxAGZATAB/wHPAZQBAAH/Ad4BzAGfIf8DygH/BAADEwEaAzkBXQNZAbwD
|
||||
ZAHbA2oB7QNjAfYDXwH7A4EB/QNfAfsDYwH2A2UB7ANjAdoDWgG6AzgBXAMTARoDQwF2AekBpwECAf8B
|
||||
6QGrARIB/wHQAcoBuwH/A6wB/wNdAf8DTAH/A0sB/wNEAf8DDwH/A7MB/wNmAf8BVAFMAToB/wGuAX0B
|
||||
BAH/A10BzAQAAf8BoAFJAv8BkgExAv8BgQERAv8BeQEDAv8BeAEAAv8BqAFcAv8B4AHNAv8BoQFmAv8B
|
||||
2AHFAv8BwAGfAv8BiQEnAv8BeAEAAf8B/gF4AQAB/wHsAW8BAAH/Ab8BWgECAf8BYwJdAd8E/wGUAYoB
|
||||
cwH/A4EB/wOBAf8BmgGKAWMB/wHPAZQBAAH/Ad4BzAGfAf8D0AH/A9AB/wPQAf8D0AH/A9AB/wPQAf8D
|
||||
0AH/A9AB/wO1Af8DGgEkA1YBrgNoAfQDgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8D
|
||||
gQH/A4EB/wNrAfIDUgGhAmoBYQHmAe0BrQEQAf8B9AHQAXYB/wP6Af8D+gH/A30B/wN/Af8DgAH/A4AB
|
||||
/wN+Af8DhAH/A7sB/wNqAf8BqAGAARwB/wJjAUgB9gQAAf8BswFvAv8BngFIAv8BiAEeAv8BfAEHAv8B
|
||||
eAEAAv8BmAFDAv8BzgG0Av8B1wHAAv8B6gHgAv8BnQFXAv8BfgERAv8BeAEAAv8BeAEAAf8B8AFxAQAB
|
||||
/wHLAWQBCQH/AWMBYQFdAd8E/wGGAYMBfgH/A4EB/wOBAf8BhgGDAXsB/wHPAZQBAAH/Ad4BzAGfAf8D
|
||||
gQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOTAf8DVwGyA2UB5wOBAf8DgQH/A4EB/wOBAf8D
|
||||
gQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DVQGvA2IB7gHvAbQBIQH/AfcB3AGXCf8D
|
||||
kQH/A4gB/wOHAf8DhwH/A4EB/wNXAf8D5gH/A6MB/wG2AZEBNgH/AmoBQQH5BAAB/wHMAZ8C/wGsAWMC
|
||||
/wGTATMC/wGBAREC/wF5AQIC/wGCARYC/wGaAUsC/wGuAXgC/wGlAVcC/wGBARcC/wF5AQQC/wF4AQAC
|
||||
/wF4AQAB/wHwAXEBAAH/AdUBcQEXAf8CYwFdAd8E/wGLAYYBeQH/A4EB/wOBAf8BjgGGAXEB/wHPAZQB
|
||||
AAH/Ad4BzAGfAf8DoQH/A6EB/wOhAf8DoQH/A6EB/wOhAf8DoQH/A6EB/wOhAf8DbwHzA18B+wOBAf8D
|
||||
gQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DVQGvA0sBjQHwAb4B
|
||||
PwH/AfQBzQFsIf8D+wH/A9AB/wHXAacBMQH/AmEBXQHRBAAB/wHpAdUC/wG8AYEC/wGkAVQC/wGOASoC
|
||||
/wF/AQ0C/wF5AQIC/wF7AQkC/wGCAR0C/wF4AQAC/wF4AQAC/wF4AQEC/wF6AQQC/wF6AQMB/wHzAXQB
|
||||
AwH/AeIBhAEyAf8DYwHfBP8BpwGUAWcB/wGDAYIBfwH/AYUBgwF+Af8BsAGUAU4B/wHTAZcBAgH/AeAB
|
||||
zgGfAf8D5wH/A+cB/wPnAf8D5wH/A+cB/wPnAf8D5wH/A+cB/wPAAf8DZAHbA2gB9AOBAf8DgQH/A4EB
|
||||
/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DVQGvAwcBCQNiAe4B8QG8ATsB
|
||||
/wH6AeoBwgH/A9wB/wN3Af8DaAH/A2gB/wNoAf8DMgn/AfIB3QGpAf8B6gGpAQgB/wM+AWoEAANeAdIB
|
||||
fwFxAWoB+QH/AbsBfQL/AaMBUgL/AZABLAL/AYIBEwL/AX0BCAL/AXoBBAL/AXkBAgL/AXoBBAL/AX0B
|
||||
CQL/AYABDwL/AX8BDQH/AfgBhgEgAf8DaAH0A1gBuAT/AdcBsQFSAf8BmgGPAXQB/wGgAZIBbQH/AeAB
|
||||
rwE3Af8B5wGpARAB/wHrAdUBoAH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DkwH/AzwB
|
||||
ZANfAckDfQH6A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DfQH6A1UB
|
||||
qgQAAzMBUQNoAfAB8wHGAVgB/wH6AecBuBb/Af4B+wH/AfkB4gGqAf8B7wG4AS0B/wNOAZYEAgQAAzwB
|
||||
ZgNjAdUDfAH4Af8BvgGFAv8BqgFfAv8BmQE+Av8BjQEnAv8BhgEaAv8BgwEVAv8BhQEZAv8BigEiAv8B
|
||||
jQEoAv8BkwEzAf8CbgFoAfUDXQHFAzYBWQT/AfQBzQFsAf8B9AHLAWYB/wH0AcsBZQH/AfQBywFlAf8B
|
||||
8QHBAUkB/wH5AeMBrAH/A4kB/wOJAf8DiQH/A4kB/wOJAf8DiQH/A4kB/wOJAf8DmgH/AwYBCAMxAUwD
|
||||
UAGbA2UB7AN9AfoDgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A30B+gNqAe0DUAGbAy8BSQgAAyIB
|
||||
MQNfAckCfQFnAfoB8wHKAWUB/wH5AeEBpgH/AfsB7QHMAf8B+wHsAcgB/wH4Ad0BmwH/A4AB/gJlAV4B
|
||||
4gM9AWgEAQwAA0IBcgNjAdUBfwF1AWoB+QH/AckBmQL/AbwBfwL/Aa4BZgL/AaQBUwL/AZ8BSgL/AZ8B
|
||||
SwL/AaMBUQL/AacBWAH/A3wB+ANdAccDOwFiBABA/wgAAwUBBgMSARcDOgFgA1EBnwNfAdMDZwHvA2MB
|
||||
9gNiAe4DXgHSA1EBngM5AV8DEQEWAwUBBhQAAw8BEwNHAYIDZAHbAn4BbwH8A2cB6gNUAagDKAE7HAAD
|
||||
PAFlA14B0gH/Ae8B4AL/AdwBvAL/Ac0BnwL/AcEBigL/AbsBfwL/Ab8BhgL/Ac0BoQL/AekB1gH/A1wB
|
||||
xAM1AVUIAAFCAU0BPgcAAT4DAAEoAwABQAMAASADAAEBAQABAQYAAQEWAAP/hQAB/wH8AcABAwQAAf8B
|
||||
/AGAAQEEAAH/AfkGAAH/AfkGAAHwARMGAAHAAQMEAAL/AYABAQQAAcABAQGAAQEEAAGAAgABAQcAAQEH
|
||||
AAEBBwABAQcAAQEGAAGAAQEGAAHAAQMBgAEBAgABwAEBAfABHwHAAQML
|
||||
</value>
|
||||
</data>
|
||||
<metadata name="ctxmChangeStatus.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
@ -628,14 +603,8 @@
|
||||
AB/+AAA//wAAf/+AAP//4AP///4///////8=
|
||||
</value>
|
||||
</data>
|
||||
<metadata name="ctxmAdminUserList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>461, 24</value>
|
||||
</metadata>
|
||||
<metadata name="ctxmAdminRoomList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>461, 49</value>
|
||||
</metadata>
|
||||
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>90</value>
|
||||
<value>133</value>
|
||||
</metadata>
|
||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
|
||||
50
qtc-net-client-2/Forms/Profile.Designer.cs
generated
@ -37,22 +37,25 @@
|
||||
btnDecline = new Button();
|
||||
btnCancelRequest = new Button();
|
||||
btnMessage = new Button();
|
||||
pbUserStatus = new PictureBox();
|
||||
pbCurrencyIcon = new PictureBox();
|
||||
lblCurrencyAmount = new Label();
|
||||
flpUsernameCurrency = new FlowLayoutPanel();
|
||||
pCurrency = new Panel();
|
||||
panel1 = new Panel();
|
||||
((System.ComponentModel.ISupportInitialize)pbUserPfp).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)pbUserStatus).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)pbCurrencyIcon).BeginInit();
|
||||
flpUsernameCurrency.SuspendLayout();
|
||||
pCurrency.SuspendLayout();
|
||||
panel1.SuspendLayout();
|
||||
SuspendLayout();
|
||||
//
|
||||
// pbUserPfp
|
||||
//
|
||||
pbUserPfp.BorderStyle = BorderStyle.FixedSingle;
|
||||
pbUserPfp.Image = Properties.Resources.DefaultPfp;
|
||||
pbUserPfp.Location = new Point(9, 5);
|
||||
pbUserPfp.Location = new Point(12, 12);
|
||||
pbUserPfp.Name = "pbUserPfp";
|
||||
pbUserPfp.Size = new Size(139, 138);
|
||||
pbUserPfp.Size = new Size(128, 126);
|
||||
pbUserPfp.SizeMode = PictureBoxSizeMode.StretchImage;
|
||||
pbUserPfp.TabIndex = 2;
|
||||
pbUserPfp.TabStop = false;
|
||||
@ -61,7 +64,7 @@
|
||||
//
|
||||
lblUsername.AutoSize = true;
|
||||
lblUsername.Font = new Font("Segoe UI Light", 15F, FontStyle.Bold);
|
||||
lblUsername.ForeColor = Color.White;
|
||||
lblUsername.ForeColor = SystemColors.ControlLight;
|
||||
lblUsername.Location = new Point(3, 0);
|
||||
lblUsername.Name = "lblUsername";
|
||||
lblUsername.Size = new Size(105, 28);
|
||||
@ -146,6 +149,17 @@
|
||||
btnMessage.Visible = false;
|
||||
btnMessage.Click += btnMessage_Click;
|
||||
//
|
||||
// pbUserStatus
|
||||
//
|
||||
pbUserStatus.BackColor = Color.Transparent;
|
||||
pbUserStatus.Image = Properties.Resources.OfflineIcon;
|
||||
pbUserStatus.Location = new Point(115, 1);
|
||||
pbUserStatus.Name = "pbUserStatus";
|
||||
pbUserStatus.Size = new Size(32, 32);
|
||||
pbUserStatus.SizeMode = PictureBoxSizeMode.StretchImage;
|
||||
pbUserStatus.TabIndex = 10;
|
||||
pbUserStatus.TabStop = false;
|
||||
//
|
||||
// pbCurrencyIcon
|
||||
//
|
||||
pbCurrencyIcon.Image = Properties.Resources.CurrencyIcon;
|
||||
@ -174,21 +188,21 @@
|
||||
//
|
||||
flpUsernameCurrency.BackColor = Color.Transparent;
|
||||
flpUsernameCurrency.Controls.Add(lblUsername);
|
||||
flpUsernameCurrency.Controls.Add(pCurrency);
|
||||
flpUsernameCurrency.Controls.Add(panel1);
|
||||
flpUsernameCurrency.Location = new Point(152, 8);
|
||||
flpUsernameCurrency.Name = "flpUsernameCurrency";
|
||||
flpUsernameCurrency.Size = new Size(246, 33);
|
||||
flpUsernameCurrency.TabIndex = 13;
|
||||
flpUsernameCurrency.WrapContents = false;
|
||||
//
|
||||
// pCurrency
|
||||
// panel1
|
||||
//
|
||||
pCurrency.Controls.Add(pbCurrencyIcon);
|
||||
pCurrency.Controls.Add(lblCurrencyAmount);
|
||||
pCurrency.Location = new Point(114, 3);
|
||||
pCurrency.Name = "pCurrency";
|
||||
pCurrency.Size = new Size(73, 24);
|
||||
pCurrency.TabIndex = 14;
|
||||
panel1.Controls.Add(pbCurrencyIcon);
|
||||
panel1.Controls.Add(lblCurrencyAmount);
|
||||
panel1.Location = new Point(114, 3);
|
||||
panel1.Name = "panel1";
|
||||
panel1.Size = new Size(73, 24);
|
||||
panel1.TabIndex = 14;
|
||||
//
|
||||
// Profile
|
||||
//
|
||||
@ -200,12 +214,12 @@
|
||||
Controls.Add(btnAccept);
|
||||
Controls.Add(btnDecline);
|
||||
Controls.Add(btnCancelRequest);
|
||||
Controls.Add(pbUserStatus);
|
||||
Controls.Add(btnAddContact);
|
||||
Controls.Add(rtxtBio);
|
||||
Controls.Add(pbUserPfp);
|
||||
Controls.Add(btnMessage);
|
||||
Font = new Font("Segoe UI Light", 9F);
|
||||
ForeColor = Color.White;
|
||||
FormBorderStyle = FormBorderStyle.FixedDialog;
|
||||
Icon = (Icon)resources.GetObject("$this.Icon");
|
||||
MaximizeBox = false;
|
||||
@ -216,11 +230,12 @@
|
||||
FormClosed += Profile_FormClosed;
|
||||
Load += frmProfile_Load;
|
||||
((System.ComponentModel.ISupportInitialize)pbUserPfp).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)pbUserStatus).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)pbCurrencyIcon).EndInit();
|
||||
flpUsernameCurrency.ResumeLayout(false);
|
||||
flpUsernameCurrency.PerformLayout();
|
||||
pCurrency.ResumeLayout(false);
|
||||
pCurrency.PerformLayout();
|
||||
panel1.ResumeLayout(false);
|
||||
panel1.PerformLayout();
|
||||
ResumeLayout(false);
|
||||
}
|
||||
|
||||
@ -234,9 +249,10 @@
|
||||
private Button btnDecline;
|
||||
private Button btnCancelRequest;
|
||||
private Button btnMessage;
|
||||
private PictureBox pbUserStatus;
|
||||
private PictureBox pbCurrencyIcon;
|
||||
private Label lblCurrencyAmount;
|
||||
private FlowLayoutPanel flpUsernameCurrency;
|
||||
private Panel pCurrency;
|
||||
private Panel panel1;
|
||||
}
|
||||
}
|
||||
@ -1,96 +1,72 @@
|
||||
using qtc_net_client_2.ClientModel;
|
||||
using qtc_net_client_2.Properties;
|
||||
using qtc_net_client_2.Services;
|
||||
using QtCNETAPI.Dtos.User;
|
||||
using QtCNETAPI.Models;
|
||||
using QtCNETAPI.Schema;
|
||||
using QtCNETAPI.Dtos.User;
|
||||
using QtCNETAPI.Services.ApiService;
|
||||
using QtCNETAPI.Services.GatewayService;
|
||||
using QtCNETAPI.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Design;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Drawing.Imaging;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using QtCNETAPI.Services.GatewayService;
|
||||
using qtc_net_client_2.ClientModel;
|
||||
using qtc_net_client_2.Properties;
|
||||
|
||||
namespace qtc_net_client_2.Forms
|
||||
{
|
||||
public partial class Profile : Form
|
||||
{
|
||||
private UserInformationDto _userInformationDto;
|
||||
private ImageFactory _imgFactory = new();
|
||||
private IApiService _apiService;
|
||||
private IGatewayService _gatewayService;
|
||||
|
||||
private ServiceResponse<byte[]>? pfpRes;
|
||||
byte[]? cosmeticRes;
|
||||
|
||||
private List<Contact> contactsList;
|
||||
public Profile(UserInformationDto userInfo, ServiceResponse<byte[]>? pfp, List<Contact> contacts, IApiService apiService, IGatewayService gatewayService, byte[]? cosmetic = null)
|
||||
public Profile(UserInformationDto userInfo, ServiceResponse<byte[]>? pfp, List<Contact> contacts, IApiService apiService, IGatewayService gatewayService)
|
||||
{
|
||||
_userInformationDto = userInfo;
|
||||
_apiService = apiService;
|
||||
_gatewayService = gatewayService;
|
||||
pfpRes = pfp;
|
||||
cosmeticRes = cosmetic;
|
||||
contactsList = contacts;
|
||||
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private async void frmProfile_Load(object sender, EventArgs e)
|
||||
private void frmProfile_Load(object sender, EventArgs e)
|
||||
{
|
||||
lblUsername.Text = _userInformationDto.Username;
|
||||
lblCurrencyAmount.Text = _userInformationDto.CurrencyAmount.ToString("N0");
|
||||
rtxtBio.Text = _userInformationDto.Bio;
|
||||
|
||||
Bitmap? pfp = null;
|
||||
if (pfpRes != null && pfpRes.Success && pfpRes.Data != null)
|
||||
{
|
||||
using (var ms = new MemoryStream(pfpRes.Data))
|
||||
{
|
||||
pfp = new Bitmap(ms);
|
||||
pbUserPfp.Image = Image.FromStream(ms);
|
||||
ms.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
var userStatus = (UserStatus)_userInformationDto.Status;
|
||||
Bitmap precenseImage = Resources.OnlineIcon;
|
||||
switch (userStatus)
|
||||
{
|
||||
case UserStatus.Online:
|
||||
precenseImage = Resources.OnlineIcon;
|
||||
pbUserStatus.Image = Resources.OnlineIcon;
|
||||
break;
|
||||
case UserStatus.Away:
|
||||
precenseImage = Resources.AwayIcon;
|
||||
pbUserStatus.Image = Resources.AwayIcon;
|
||||
break;
|
||||
case UserStatus.DoNotDisturb:
|
||||
precenseImage = Resources.DNDIcon;
|
||||
pbUserStatus.Image = Resources.DNDIcon;
|
||||
break;
|
||||
case UserStatus.Offline:
|
||||
precenseImage = Resources.OfflineIcon;
|
||||
pbUserStatus.Image = Resources.OfflineIcon;
|
||||
break;
|
||||
}
|
||||
|
||||
Bitmap? cosmetic = null;
|
||||
if(cosmeticRes != null)
|
||||
{
|
||||
using var ms = new MemoryStream(cosmeticRes);
|
||||
cosmetic = new Bitmap(ms);
|
||||
}
|
||||
|
||||
pbUserPfp.Image = _imgFactory.CreateProfileImage(precenseImage, pfp, cosmetic);
|
||||
precenseImage.Dispose();
|
||||
pfp?.Dispose();
|
||||
cosmetic?.Dispose();
|
||||
|
||||
if (_userInformationDto.Id == _apiService.CurrentUser!.Id)
|
||||
{
|
||||
btnAddContact.Visible = false;
|
||||
@ -177,20 +153,21 @@ namespace qtc_net_client_2.Forms
|
||||
btnAddContact.Enabled = false;
|
||||
using (var ms = new MemoryStream(Resources.RequestSentIcon)) { btnAddContact.Image = Image.FromStream(ms); ms.Dispose(); }
|
||||
btnCancelRequest.Visible = true;
|
||||
|
||||
await _gatewayService.RefreshContactsForUser(_userInformationDto);
|
||||
}
|
||||
}
|
||||
|
||||
private async void btnAddContact_Click_Remove(object sender, EventArgs e)
|
||||
{
|
||||
var msgBoxResult = MessageBox.Show("Are You Sure You Want To Remove This User From Your Contacts?", "Question", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
|
||||
if (msgBoxResult == DialogResult.No) return;
|
||||
|
||||
var result = await _apiService.RemoveContactFromCurrentUser(_userInformationDto.Id);
|
||||
if (result.Success)
|
||||
{
|
||||
btnAddContact.Image = Resources.AddContactIcon;
|
||||
btnAddContact.Click += btnAddContact_Click_Add;
|
||||
btnMessage.Visible = false;
|
||||
|
||||
await _gatewayService.RefreshContactsForUser(_userInformationDto);
|
||||
}
|
||||
}
|
||||
|
||||
@ -206,14 +183,13 @@ namespace qtc_net_client_2.Forms
|
||||
btnAddContact.Image = Resources.RemoveContactIcon;
|
||||
btnAddContact.Click += btnAddContact_Click_Remove;
|
||||
if (_userInformationDto.Status >= 1) btnMessage.Visible = true;
|
||||
|
||||
await _gatewayService.RefreshContactsForUser(_userInformationDto);
|
||||
}
|
||||
}
|
||||
|
||||
private async void btnDecline_Click(object sender, EventArgs e)
|
||||
{
|
||||
var msgBoxResult = MessageBox.Show("Are You Sure You Want To Decline This Request?", "Question", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
|
||||
if (msgBoxResult == DialogResult.No) return;
|
||||
|
||||
var result = await _apiService.RemoveContactFromCurrentUser(_userInformationDto.Id);
|
||||
if (result.Success)
|
||||
{
|
||||
@ -223,14 +199,13 @@ namespace qtc_net_client_2.Forms
|
||||
btnAddContact.Visible = true;
|
||||
btnAddContact.Image = Resources.AddContactIcon;
|
||||
btnAddContact.Click += btnAddContact_Click_Add;
|
||||
|
||||
await _gatewayService.RefreshContactsForUser(_userInformationDto);
|
||||
}
|
||||
}
|
||||
|
||||
private async void btnCancelRequest_Click(object sender, EventArgs e)
|
||||
{
|
||||
var msgBoxResult = MessageBox.Show("Are You Sure You Want To Cancel This Request?", "Question", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
|
||||
if (msgBoxResult == DialogResult.No) return;
|
||||
|
||||
var result = await _apiService.RemoveContactFromCurrentUser(_userInformationDto.Id);
|
||||
if (result.Success)
|
||||
{
|
||||
@ -239,6 +214,8 @@ namespace qtc_net_client_2.Forms
|
||||
btnAddContact.Click += btnAddContact_Click_Add;
|
||||
|
||||
btnCancelRequest.Visible = false;
|
||||
|
||||
await _gatewayService.RefreshContactsForUser(_userInformationDto);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
32
qtc-net-client-2/Forms/ProfileEdit.Designer.cs
generated
@ -33,8 +33,6 @@
|
||||
rtxtBio = new RichTextBox();
|
||||
lblBio = new Label();
|
||||
btnSave = new Button();
|
||||
cbCosmetic = new ComboBox();
|
||||
lblCosmetic = new Label();
|
||||
SuspendLayout();
|
||||
//
|
||||
// tbUsername
|
||||
@ -73,7 +71,7 @@
|
||||
// btnSave
|
||||
//
|
||||
btnSave.ForeColor = Color.Black;
|
||||
btnSave.Location = new Point(76, 177);
|
||||
btnSave.Location = new Point(76, 148);
|
||||
btnSave.Name = "btnSave";
|
||||
btnSave.Size = new Size(43, 23);
|
||||
btnSave.TabIndex = 4;
|
||||
@ -81,32 +79,12 @@
|
||||
btnSave.UseVisualStyleBackColor = true;
|
||||
btnSave.Click += btnSave_Click;
|
||||
//
|
||||
// cbCosmetic
|
||||
//
|
||||
cbCosmetic.FormattingEnabled = true;
|
||||
cbCosmetic.Items.AddRange(new object[] { "(None)" });
|
||||
cbCosmetic.Location = new Point(76, 148);
|
||||
cbCosmetic.Name = "cbCosmetic";
|
||||
cbCosmetic.Size = new Size(121, 23);
|
||||
cbCosmetic.TabIndex = 5;
|
||||
//
|
||||
// lblCosmetic
|
||||
//
|
||||
lblCosmetic.AutoSize = true;
|
||||
lblCosmetic.Location = new Point(21, 151);
|
||||
lblCosmetic.Name = "lblCosmetic";
|
||||
lblCosmetic.Size = new Size(53, 15);
|
||||
lblCosmetic.TabIndex = 6;
|
||||
lblCosmetic.Text = "Cosmetic";
|
||||
//
|
||||
// ProfileEdit
|
||||
// frmProfileEdit
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(6F, 15F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
BackColor = Color.DodgerBlue;
|
||||
ClientSize = new Size(345, 208);
|
||||
Controls.Add(lblCosmetic);
|
||||
Controls.Add(cbCosmetic);
|
||||
ClientSize = new Size(345, 187);
|
||||
Controls.Add(btnSave);
|
||||
Controls.Add(lblBio);
|
||||
Controls.Add(rtxtBio);
|
||||
@ -117,7 +95,7 @@
|
||||
FormBorderStyle = FormBorderStyle.FixedDialog;
|
||||
MaximizeBox = false;
|
||||
MinimizeBox = false;
|
||||
Name = "ProfileEdit";
|
||||
Name = "frmProfileEdit";
|
||||
StartPosition = FormStartPosition.CenterParent;
|
||||
Text = "QtC.NET Client - Edit Profile";
|
||||
Load += frmProfileEdit_Load;
|
||||
@ -132,7 +110,5 @@
|
||||
private RichTextBox rtxtBio;
|
||||
private Label lblBio;
|
||||
private Button btnSave;
|
||||
private ComboBox cbCosmetic;
|
||||
private Label lblCosmetic;
|
||||
}
|
||||
}
|
||||
@ -1,6 +1,4 @@
|
||||
using Microsoft.AspNetCore.Mvc.TagHelpers;
|
||||
using qtc_net_client_2.ClientModel;
|
||||
using QtCNETAPI.Dtos.User;
|
||||
using QtCNETAPI.Dtos.User;
|
||||
using QtCNETAPI.Services.ApiService;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
@ -17,63 +15,22 @@ namespace qtc_net_client_2.Forms
|
||||
public partial class ProfileEdit : Form
|
||||
{
|
||||
IApiService _apiService;
|
||||
private int currentCosmetic = 0;
|
||||
public ProfileEdit(IApiService apiService)
|
||||
{
|
||||
_apiService = apiService;
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private async void frmProfileEdit_Load(object sender, EventArgs e)
|
||||
private void frmProfileEdit_Load(object sender, EventArgs e)
|
||||
{
|
||||
tbUsername.Text = _apiService.CurrentUser.Username;
|
||||
rtxtBio.Text = _apiService.CurrentUser.Bio;
|
||||
|
||||
// get all owned cosmetics
|
||||
var boughtItems = await _apiService.GetOwnedStoreItems();
|
||||
List<ComboBoxItem> items = new List<ComboBoxItem>();
|
||||
|
||||
if(boughtItems != null && boughtItems.Success && boughtItems.Data != null)
|
||||
{
|
||||
items.Add(new ComboBoxItem
|
||||
{
|
||||
Name = "(None)",
|
||||
Value = 0
|
||||
});
|
||||
|
||||
foreach (var item in boughtItems.Data)
|
||||
{
|
||||
// get item from the store
|
||||
var storeItem = await _apiService.GetStoreItem(item.StoreItemId);
|
||||
if(storeItem != null && storeItem.Success && storeItem.Data != null)
|
||||
{
|
||||
var cbi = new ComboBoxItem
|
||||
{
|
||||
Name = storeItem.Data.Name,
|
||||
Value = storeItem.Data.Id
|
||||
};
|
||||
items.Add(cbi);
|
||||
}
|
||||
}
|
||||
} else
|
||||
{
|
||||
items.Add(new ComboBoxItem
|
||||
{
|
||||
Name = "(None)",
|
||||
Value = 0
|
||||
});
|
||||
}
|
||||
|
||||
cbCosmetic.DataSource = items;
|
||||
cbCosmetic.SelectedIndex = cbCosmetic.Items.IndexOf(items.FirstOrDefault(e => (int?)e.Value == _apiService.CurrentUser.ActiveProfileCosmetic));
|
||||
currentCosmetic = cbCosmetic.Items.IndexOf(items.FirstOrDefault(e => (int?)e.Value == _apiService.CurrentUser.ActiveProfileCosmetic));
|
||||
tbUsername.Text = _apiService.CurrentUser!.Username;
|
||||
rtxtBio.Text = _apiService.CurrentUser!.Bio;
|
||||
}
|
||||
|
||||
private async void btnSave_Click(object sender, EventArgs e)
|
||||
{
|
||||
ComboBoxItem? selectedItem = (ComboBoxItem?)cbCosmetic.SelectedItem;
|
||||
int selectedItemId = 0;
|
||||
|
||||
if(!string.IsNullOrEmpty(tbUsername.Text) && (tbUsername.Text != _apiService.CurrentUser!.Username || rtxtBio.Text != _apiService.CurrentUser!.Bio))
|
||||
{
|
||||
// update user info
|
||||
UserUpdateInformationDto userUpdateInformationDto = new UserUpdateInformationDto
|
||||
{
|
||||
@ -83,18 +40,11 @@ namespace qtc_net_client_2.Forms
|
||||
DateOfBirth = _apiService.CurrentUser.DateOfBirth
|
||||
};
|
||||
|
||||
if (selectedItem != null)
|
||||
{
|
||||
selectedItemId = (int?)selectedItem.Value ?? 0;
|
||||
userUpdateInformationDto.ProfileCosmeticId = selectedItemId;
|
||||
}
|
||||
|
||||
var res = await _apiService.UpdateUserInformationAsync(userUpdateInformationDto);
|
||||
|
||||
if (res.Success)
|
||||
{
|
||||
if (currentCosmetic != selectedItemId) DialogResult = DialogResult.Yes; // trigger ui refresh
|
||||
else DialogResult = DialogResult.OK;
|
||||
DialogResult = DialogResult.OK;
|
||||
Close();
|
||||
}
|
||||
else
|
||||
@ -106,3 +56,4 @@ namespace qtc_net_client_2.Forms
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -43,7 +43,6 @@ namespace qtc_net_client_2.Forms
|
||||
|
||||
if(registerResult.Success)
|
||||
{
|
||||
MessageBox.Show("Registration Complete. If the server has email verification on, you may need to check your email for a verification link.\nIf you do not receive one, try logging in.");
|
||||
DialogResult = DialogResult.OK;
|
||||
Close();
|
||||
} else
|
||||
|
||||
@ -1,104 +0,0 @@
|
||||
namespace qtc_net_client_2.Forms
|
||||
{
|
||||
partial class ResendVerificationEmail
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
pbLoginBanner = new PictureBox();
|
||||
tbEmail = new TextBox();
|
||||
lblHeader = new Label();
|
||||
btnSend = new Button();
|
||||
((System.ComponentModel.ISupportInitialize)pbLoginBanner).BeginInit();
|
||||
SuspendLayout();
|
||||
//
|
||||
// pbLoginBanner
|
||||
//
|
||||
pbLoginBanner.Image = Properties.Resources.LoginBanner;
|
||||
pbLoginBanner.Location = new Point(-4, 0);
|
||||
pbLoginBanner.Name = "pbLoginBanner";
|
||||
pbLoginBanner.Size = new Size(521, 99);
|
||||
pbLoginBanner.SizeMode = PictureBoxSizeMode.StretchImage;
|
||||
pbLoginBanner.TabIndex = 1;
|
||||
pbLoginBanner.TabStop = false;
|
||||
//
|
||||
// tbEmail
|
||||
//
|
||||
tbEmail.Location = new Point(50, 124);
|
||||
tbEmail.Name = "tbEmail";
|
||||
tbEmail.Size = new Size(424, 23);
|
||||
tbEmail.TabIndex = 3;
|
||||
//
|
||||
// lblHeader
|
||||
//
|
||||
lblHeader.AutoSize = true;
|
||||
lblHeader.Font = new Font("Segoe UI Light", 9F);
|
||||
lblHeader.ForeColor = SystemColors.ControlLight;
|
||||
lblHeader.Location = new Point(54, 106);
|
||||
lblHeader.Name = "lblHeader";
|
||||
lblHeader.Size = new Size(412, 15);
|
||||
lblHeader.TabIndex = 5;
|
||||
lblHeader.Text = "Please Enter Your Email, If An Account Exists With This Email, We'll Send You A Link";
|
||||
//
|
||||
// btnSend
|
||||
//
|
||||
btnSend.Location = new Point(224, 153);
|
||||
btnSend.Name = "btnSend";
|
||||
btnSend.Size = new Size(75, 23);
|
||||
btnSend.TabIndex = 6;
|
||||
btnSend.Text = "Send";
|
||||
btnSend.UseVisualStyleBackColor = true;
|
||||
btnSend.Click += btnSend_Click;
|
||||
//
|
||||
// ResendVerificationEmail
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(7F, 15F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
BackColor = Color.DodgerBlue;
|
||||
ClientSize = new Size(515, 187);
|
||||
Controls.Add(btnSend);
|
||||
Controls.Add(lblHeader);
|
||||
Controls.Add(tbEmail);
|
||||
Controls.Add(pbLoginBanner);
|
||||
FormBorderStyle = FormBorderStyle.FixedDialog;
|
||||
MaximizeBox = false;
|
||||
MinimizeBox = false;
|
||||
Name = "ResendVerificationEmail";
|
||||
StartPosition = FormStartPosition.CenterScreen;
|
||||
Text = "QtC.NET Client - Resend Verification Email";
|
||||
((System.ComponentModel.ISupportInitialize)pbLoginBanner).EndInit();
|
||||
ResumeLayout(false);
|
||||
PerformLayout();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private PictureBox pbLoginBanner;
|
||||
private TextBox tbEmail;
|
||||
private Label lblHeader;
|
||||
private Button btnSend;
|
||||
}
|
||||
}
|
||||
@ -1,43 +0,0 @@
|
||||
using QtCNETAPI.Services.ApiService;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace qtc_net_client_2.Forms
|
||||
{
|
||||
public partial class ResendVerificationEmail : Form
|
||||
{
|
||||
private IApiService _apiService;
|
||||
public ResendVerificationEmail(IApiService apiService)
|
||||
{
|
||||
_apiService = apiService;
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private async void btnSend_Click(object sender, EventArgs e)
|
||||
{
|
||||
if(!string.IsNullOrEmpty(tbEmail.Text))
|
||||
{
|
||||
tbEmail.Enabled = false;
|
||||
btnSend.Enabled = false;
|
||||
|
||||
var result = await _apiService.ResendVerificationEmail(tbEmail.Text);
|
||||
if(result != null && result.Success && result.Data)
|
||||
{
|
||||
MessageBox.Show("Got It! You should receive an email shortly.\nIf you do not receive an email, check your spam.", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
||||
Close();
|
||||
} else
|
||||
{
|
||||
MessageBox.Show("Sorry, This Server Doesn't Have Email Features Enabled Or Something Went Wrong.\nIf you cannot login, you may need to contact the server admin.", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,120 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
221
qtc-net-client-2/Forms/ResetPassword.Designer.cs
generated
@ -1,221 +0,0 @@
|
||||
namespace qtc_net_client_2.Forms
|
||||
{
|
||||
partial class ResetPassword
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
pEmailBox = new Panel();
|
||||
btnSend = new Button();
|
||||
lblHeader = new Label();
|
||||
tbEmail = new TextBox();
|
||||
pResetPasswordBox = new Panel();
|
||||
btnResetPassword = new Button();
|
||||
tbConfirmPassword = new TextBox();
|
||||
lblConfirmPassword = new Label();
|
||||
tbNewPassword = new TextBox();
|
||||
lblNewPassword = new Label();
|
||||
tbToken = new TextBox();
|
||||
lblToken = new Label();
|
||||
pbLoginBanner = new PictureBox();
|
||||
pEmailBox.SuspendLayout();
|
||||
pResetPasswordBox.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)pbLoginBanner).BeginInit();
|
||||
SuspendLayout();
|
||||
//
|
||||
// pEmailBox
|
||||
//
|
||||
pEmailBox.Anchor = AnchorStyles.Bottom;
|
||||
pEmailBox.BorderStyle = BorderStyle.FixedSingle;
|
||||
pEmailBox.Controls.Add(btnSend);
|
||||
pEmailBox.Controls.Add(lblHeader);
|
||||
pEmailBox.Controls.Add(tbEmail);
|
||||
pEmailBox.Location = new Point(101, 125);
|
||||
pEmailBox.Name = "pEmailBox";
|
||||
pEmailBox.Size = new Size(458, 94);
|
||||
pEmailBox.TabIndex = 0;
|
||||
//
|
||||
// btnSend
|
||||
//
|
||||
btnSend.Location = new Point(193, 59);
|
||||
btnSend.Name = "btnSend";
|
||||
btnSend.Size = new Size(75, 23);
|
||||
btnSend.TabIndex = 9;
|
||||
btnSend.Text = "Send";
|
||||
btnSend.UseVisualStyleBackColor = true;
|
||||
btnSend.Click += btnSend_Click;
|
||||
//
|
||||
// lblHeader
|
||||
//
|
||||
lblHeader.AutoSize = true;
|
||||
lblHeader.Font = new Font("Segoe UI Light", 9F);
|
||||
lblHeader.ForeColor = SystemColors.ControlLight;
|
||||
lblHeader.Location = new Point(23, 12);
|
||||
lblHeader.Name = "lblHeader";
|
||||
lblHeader.Size = new Size(412, 15);
|
||||
lblHeader.TabIndex = 8;
|
||||
lblHeader.Text = "Please Enter Your Email, If An Account Exists With This Email, We'll Send You A Link";
|
||||
//
|
||||
// tbEmail
|
||||
//
|
||||
tbEmail.Location = new Point(19, 30);
|
||||
tbEmail.Name = "tbEmail";
|
||||
tbEmail.Size = new Size(424, 23);
|
||||
tbEmail.TabIndex = 7;
|
||||
//
|
||||
// pResetPasswordBox
|
||||
//
|
||||
pResetPasswordBox.Anchor = AnchorStyles.Bottom;
|
||||
pResetPasswordBox.BorderStyle = BorderStyle.FixedSingle;
|
||||
pResetPasswordBox.Controls.Add(btnResetPassword);
|
||||
pResetPasswordBox.Controls.Add(tbConfirmPassword);
|
||||
pResetPasswordBox.Controls.Add(lblConfirmPassword);
|
||||
pResetPasswordBox.Controls.Add(tbNewPassword);
|
||||
pResetPasswordBox.Controls.Add(lblNewPassword);
|
||||
pResetPasswordBox.Controls.Add(tbToken);
|
||||
pResetPasswordBox.Controls.Add(lblToken);
|
||||
pResetPasswordBox.Location = new Point(17, 106);
|
||||
pResetPasswordBox.Name = "pResetPasswordBox";
|
||||
pResetPasswordBox.Size = new Size(596, 138);
|
||||
pResetPasswordBox.TabIndex = 1;
|
||||
pResetPasswordBox.Visible = false;
|
||||
//
|
||||
// btnResetPassword
|
||||
//
|
||||
btnResetPassword.Location = new Point(270, 102);
|
||||
btnResetPassword.Name = "btnResetPassword";
|
||||
btnResetPassword.Size = new Size(100, 23);
|
||||
btnResetPassword.TabIndex = 15;
|
||||
btnResetPassword.Text = "Reset Password";
|
||||
btnResetPassword.UseVisualStyleBackColor = true;
|
||||
btnResetPassword.Click += btnResetPassword_Click;
|
||||
//
|
||||
// tbConfirmPassword
|
||||
//
|
||||
tbConfirmPassword.Location = new Point(123, 73);
|
||||
tbConfirmPassword.Name = "tbConfirmPassword";
|
||||
tbConfirmPassword.PasswordChar = '*';
|
||||
tbConfirmPassword.Size = new Size(424, 23);
|
||||
tbConfirmPassword.TabIndex = 14;
|
||||
//
|
||||
// lblConfirmPassword
|
||||
//
|
||||
lblConfirmPassword.AutoSize = true;
|
||||
lblConfirmPassword.Font = new Font("Segoe UI Light", 9F);
|
||||
lblConfirmPassword.ForeColor = SystemColors.ControlLight;
|
||||
lblConfirmPassword.Location = new Point(20, 76);
|
||||
lblConfirmPassword.Name = "lblConfirmPassword";
|
||||
lblConfirmPassword.Size = new Size(97, 15);
|
||||
lblConfirmPassword.TabIndex = 13;
|
||||
lblConfirmPassword.Text = "Confirm Password";
|
||||
//
|
||||
// tbNewPassword
|
||||
//
|
||||
tbNewPassword.Location = new Point(123, 44);
|
||||
tbNewPassword.Name = "tbNewPassword";
|
||||
tbNewPassword.PasswordChar = '*';
|
||||
tbNewPassword.Size = new Size(424, 23);
|
||||
tbNewPassword.TabIndex = 12;
|
||||
//
|
||||
// lblNewPassword
|
||||
//
|
||||
lblNewPassword.AutoSize = true;
|
||||
lblNewPassword.Font = new Font("Segoe UI Light", 9F);
|
||||
lblNewPassword.ForeColor = SystemColors.ControlLight;
|
||||
lblNewPassword.Location = new Point(36, 47);
|
||||
lblNewPassword.Name = "lblNewPassword";
|
||||
lblNewPassword.Size = new Size(81, 15);
|
||||
lblNewPassword.TabIndex = 11;
|
||||
lblNewPassword.Text = "New Password";
|
||||
//
|
||||
// tbToken
|
||||
//
|
||||
tbToken.Location = new Point(123, 15);
|
||||
tbToken.Name = "tbToken";
|
||||
tbToken.Size = new Size(424, 23);
|
||||
tbToken.TabIndex = 10;
|
||||
//
|
||||
// lblToken
|
||||
//
|
||||
lblToken.AutoSize = true;
|
||||
lblToken.Font = new Font("Segoe UI Light", 9F);
|
||||
lblToken.ForeColor = SystemColors.ControlLight;
|
||||
lblToken.Location = new Point(82, 18);
|
||||
lblToken.Name = "lblToken";
|
||||
lblToken.Size = new Size(35, 15);
|
||||
lblToken.TabIndex = 9;
|
||||
lblToken.Text = "Token";
|
||||
//
|
||||
// pbLoginBanner
|
||||
//
|
||||
pbLoginBanner.Image = Properties.Resources.LoginBanner;
|
||||
pbLoginBanner.Location = new Point(-3, -1);
|
||||
pbLoginBanner.Name = "pbLoginBanner";
|
||||
pbLoginBanner.Size = new Size(521, 99);
|
||||
pbLoginBanner.SizeMode = PictureBoxSizeMode.StretchImage;
|
||||
pbLoginBanner.TabIndex = 2;
|
||||
pbLoginBanner.TabStop = false;
|
||||
//
|
||||
// ResetPassword
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(7F, 15F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
BackColor = Color.DodgerBlue;
|
||||
ClientSize = new Size(622, 256);
|
||||
Controls.Add(pEmailBox);
|
||||
Controls.Add(pResetPasswordBox);
|
||||
Controls.Add(pbLoginBanner);
|
||||
FormBorderStyle = FormBorderStyle.FixedDialog;
|
||||
MaximizeBox = false;
|
||||
MinimizeBox = false;
|
||||
Name = "ResetPassword";
|
||||
StartPosition = FormStartPosition.CenterScreen;
|
||||
Text = "QtC.NET Client - Reset Password";
|
||||
pEmailBox.ResumeLayout(false);
|
||||
pEmailBox.PerformLayout();
|
||||
pResetPasswordBox.ResumeLayout(false);
|
||||
pResetPasswordBox.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)pbLoginBanner).EndInit();
|
||||
ResumeLayout(false);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private Panel pEmailBox;
|
||||
private Button btnSend;
|
||||
private Label lblHeader;
|
||||
private TextBox tbEmail;
|
||||
private Panel pResetPasswordBox;
|
||||
private TextBox tbConfirmPassword;
|
||||
private Label lblConfirmPassword;
|
||||
private TextBox tbNewPassword;
|
||||
private Label lblNewPassword;
|
||||
private TextBox tbToken;
|
||||
private Label lblToken;
|
||||
private Button btnResetPassword;
|
||||
private PictureBox pbLoginBanner;
|
||||
}
|
||||
}
|
||||
@ -1,68 +0,0 @@
|
||||
using QtCNETAPI.Services.ApiService;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace qtc_net_client_2.Forms
|
||||
{
|
||||
public partial class ResetPassword : Form
|
||||
{
|
||||
private IApiService _apiService;
|
||||
public ResetPassword(IApiService apiService)
|
||||
{
|
||||
_apiService = apiService;
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private async void btnSend_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(tbEmail.Text))
|
||||
{
|
||||
tbEmail.Enabled = false;
|
||||
btnSend.Enabled = false;
|
||||
|
||||
var result = await _apiService.SendPasswordResetEmail(tbEmail.Text);
|
||||
if (result != null && result.Success && result.Data)
|
||||
{
|
||||
pEmailBox.Visible = false;
|
||||
pResetPasswordBox.Visible = true;
|
||||
|
||||
MessageBox.Show("Got It! You should receive an email shortly.\nIf you do not receive an email, check your spam.");
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox.Show("Sorry, This Server Doesn't Have Email Features Enabled Or Something Went Wrong.\nIf you cannot login, you may need to contact the server admin.", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async void btnResetPassword_Click(object sender, EventArgs e)
|
||||
{
|
||||
if(!string.IsNullOrEmpty(tbToken.Text) && !string.IsNullOrEmpty(tbNewPassword.Text) && !string.IsNullOrEmpty(tbConfirmPassword.Text))
|
||||
{
|
||||
tbToken.Enabled = false;
|
||||
tbNewPassword.Enabled = false;
|
||||
tbConfirmPassword.Enabled = false;
|
||||
btnResetPassword.Enabled = false;
|
||||
|
||||
var result = await _apiService.ResetPassword(new QtCNETAPI.Dtos.User.UserPasswordResetDto { Token = tbToken.Text, Password = tbNewPassword.Text });
|
||||
if(result != null && result.Success && result.Data)
|
||||
{
|
||||
MessageBox.Show("Your Password Has Been Reset. You may now login with the new password.", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
||||
Close();
|
||||
} else
|
||||
{
|
||||
MessageBox.Show(result?.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,120 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
12
qtc-net-client-2/Forms/StockMarketGame.Designer.cs
generated
@ -52,7 +52,7 @@
|
||||
pStockManagement.Controls.Add(btnSell);
|
||||
pStockManagement.Controls.Add(btnBuy);
|
||||
pStockManagement.Controls.Add(lblStockCount);
|
||||
pStockManagement.Location = new Point(230, 138);
|
||||
pStockManagement.Location = new Point(242, 134);
|
||||
pStockManagement.Name = "pStockManagement";
|
||||
pStockManagement.Size = new Size(135, 81);
|
||||
pStockManagement.TabIndex = 3;
|
||||
@ -106,7 +106,7 @@
|
||||
pMarketStatus.Controls.Add(lblMarketStatus);
|
||||
pMarketStatus.Controls.Add(pbDollarSignRight);
|
||||
pMarketStatus.Controls.Add(pbDollarSignLeft);
|
||||
pMarketStatus.Location = new Point(3, 7);
|
||||
pMarketStatus.Location = new Point(9, 7);
|
||||
pMarketStatus.Name = "pMarketStatus";
|
||||
pMarketStatus.Size = new Size(586, 100);
|
||||
pMarketStatus.TabIndex = 4;
|
||||
@ -135,7 +135,7 @@
|
||||
// pbDollarSignRight
|
||||
//
|
||||
pbDollarSignRight.Image = Properties.Resources.dollar_money;
|
||||
pbDollarSignRight.Location = new Point(500, 3);
|
||||
pbDollarSignRight.Location = new Point(498, 3);
|
||||
pbDollarSignRight.Name = "pbDollarSignRight";
|
||||
pbDollarSignRight.Size = new Size(83, 94);
|
||||
pbDollarSignRight.SizeMode = PictureBoxSizeMode.Zoom;
|
||||
@ -145,7 +145,7 @@
|
||||
// pbDollarSignLeft
|
||||
//
|
||||
pbDollarSignLeft.Image = Properties.Resources.dollar_money;
|
||||
pbDollarSignLeft.Location = new Point(3, 3);
|
||||
pbDollarSignLeft.Location = new Point(6, 3);
|
||||
pbDollarSignLeft.Name = "pbDollarSignLeft";
|
||||
pbDollarSignLeft.Size = new Size(83, 94);
|
||||
pbDollarSignLeft.SizeMode = PictureBoxSizeMode.Zoom;
|
||||
@ -156,7 +156,7 @@
|
||||
//
|
||||
btnRefresh.Enabled = false;
|
||||
btnRefresh.ForeColor = Color.Black;
|
||||
btnRefresh.Location = new Point(270, 113);
|
||||
btnRefresh.Location = new Point(282, 109);
|
||||
btnRefresh.Name = "btnRefresh";
|
||||
btnRefresh.Size = new Size(56, 23);
|
||||
btnRefresh.TabIndex = 10;
|
||||
@ -169,7 +169,7 @@
|
||||
AutoScaleDimensions = new SizeF(7F, 15F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
BackColor = Color.DodgerBlue;
|
||||
ClientSize = new Size(595, 227);
|
||||
ClientSize = new Size(606, 227);
|
||||
Controls.Add(btnRefresh);
|
||||
Controls.Add(pMarketStatus);
|
||||
Controls.Add(pStockManagement);
|
||||
|
||||
@ -44,6 +44,19 @@ namespace qtc_net_client_2.Forms
|
||||
_apiService.CurrentUser.StockAmount = result.Data.StockAmount;
|
||||
_apiService.CurrentUser.CurrencyAmount = result.Data.CurrencyAmount;
|
||||
|
||||
Main? mainWindow = (Main?)Application.OpenForms[0];
|
||||
if (mainWindow != null)
|
||||
{
|
||||
if (mainWindow.InvokeRequired)
|
||||
{
|
||||
mainWindow.Invoke(mainWindow.RefreshCurrencyCounter);
|
||||
}
|
||||
else
|
||||
{
|
||||
mainWindow.RefreshCurrencyCounter();
|
||||
}
|
||||
}
|
||||
|
||||
nudStockBuySellAmount.Enabled = true;
|
||||
nudStockBuySellAmount.Value = 0;
|
||||
btnBuy.Enabled = true;
|
||||
@ -82,6 +95,19 @@ namespace qtc_net_client_2.Forms
|
||||
_apiService.CurrentUser.StockAmount = result.Data.StockAmount;
|
||||
_apiService.CurrentUser.CurrencyAmount = result.Data.CurrencyAmount;
|
||||
|
||||
Main? mainWindow = (Main?)Application.OpenForms[0];
|
||||
if (mainWindow != null)
|
||||
{
|
||||
if (mainWindow.InvokeRequired)
|
||||
{
|
||||
mainWindow.Invoke(mainWindow.RefreshCurrencyCounter);
|
||||
}
|
||||
else
|
||||
{
|
||||
mainWindow.RefreshCurrencyCounter();
|
||||
}
|
||||
}
|
||||
|
||||
nudStockBuySellAmount.Enabled = true;
|
||||
nudStockBuySellAmount.Value = 0;
|
||||
btnBuy.Enabled = true;
|
||||
|
||||
135
qtc-net-client-2/Forms/StoreItemDisplay.Designer.cs
generated
@ -1,135 +0,0 @@
|
||||
namespace qtc_net_client_2.Forms
|
||||
{
|
||||
partial class StoreItemDisplay
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(StoreItemDisplay));
|
||||
pbItemThumbnail = new PictureBox();
|
||||
lblName = new Label();
|
||||
lblDescription = new Label();
|
||||
btnBuy = new Button();
|
||||
pbCurrencyIcon = new PictureBox();
|
||||
lblPrice = new Label();
|
||||
((System.ComponentModel.ISupportInitialize)pbItemThumbnail).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)pbCurrencyIcon).BeginInit();
|
||||
SuspendLayout();
|
||||
//
|
||||
// pbItemThumbnail
|
||||
//
|
||||
pbItemThumbnail.Location = new Point(12, 12);
|
||||
pbItemThumbnail.Name = "pbItemThumbnail";
|
||||
pbItemThumbnail.Size = new Size(148, 141);
|
||||
pbItemThumbnail.SizeMode = PictureBoxSizeMode.StretchImage;
|
||||
pbItemThumbnail.TabIndex = 0;
|
||||
pbItemThumbnail.TabStop = false;
|
||||
//
|
||||
// lblName
|
||||
//
|
||||
lblName.AutoSize = true;
|
||||
lblName.Font = new Font("Segoe UI", 21.75F, FontStyle.Bold | FontStyle.Italic, GraphicsUnit.Point, 0);
|
||||
lblName.Location = new Point(165, 7);
|
||||
lblName.Name = "lblName";
|
||||
lblName.Size = new Size(239, 40);
|
||||
lblName.TabIndex = 1;
|
||||
lblName.Text = "Item Name Here";
|
||||
//
|
||||
// lblDescription
|
||||
//
|
||||
lblDescription.Location = new Point(169, 44);
|
||||
lblDescription.Name = "lblDescription";
|
||||
lblDescription.Size = new Size(448, 109);
|
||||
lblDescription.TabIndex = 2;
|
||||
lblDescription.Text = resources.GetString("lblDescription.Text");
|
||||
//
|
||||
// btnBuy
|
||||
//
|
||||
btnBuy.ForeColor = Color.Black;
|
||||
btnBuy.Location = new Point(542, 157);
|
||||
btnBuy.Name = "btnBuy";
|
||||
btnBuy.Size = new Size(75, 23);
|
||||
btnBuy.TabIndex = 3;
|
||||
btnBuy.Text = "Buy";
|
||||
btnBuy.UseVisualStyleBackColor = true;
|
||||
btnBuy.Click += btnBuy_Click;
|
||||
//
|
||||
// pbCurrencyIcon
|
||||
//
|
||||
pbCurrencyIcon.Image = Properties.Resources.CurrencyIcon;
|
||||
pbCurrencyIcon.Location = new Point(48, 161);
|
||||
pbCurrencyIcon.Name = "pbCurrencyIcon";
|
||||
pbCurrencyIcon.Size = new Size(15, 14);
|
||||
pbCurrencyIcon.SizeMode = PictureBoxSizeMode.StretchImage;
|
||||
pbCurrencyIcon.TabIndex = 19;
|
||||
pbCurrencyIcon.TabStop = false;
|
||||
//
|
||||
// lblPrice
|
||||
//
|
||||
lblPrice.AutoEllipsis = true;
|
||||
lblPrice.Font = new Font("Segoe UI", 8F, FontStyle.Bold, GraphicsUnit.Point, 0);
|
||||
lblPrice.Location = new Point(64, 162);
|
||||
lblPrice.Name = "lblPrice";
|
||||
lblPrice.Size = new Size(61, 13);
|
||||
lblPrice.TabIndex = 20;
|
||||
lblPrice.Text = "99,999,999";
|
||||
//
|
||||
// StoreItemDisplay
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(7F, 15F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
BackColor = Color.DodgerBlue;
|
||||
ClientSize = new Size(629, 188);
|
||||
Controls.Add(lblPrice);
|
||||
Controls.Add(pbCurrencyIcon);
|
||||
Controls.Add(btnBuy);
|
||||
Controls.Add(lblDescription);
|
||||
Controls.Add(lblName);
|
||||
Controls.Add(pbItemThumbnail);
|
||||
ForeColor = Color.White;
|
||||
FormBorderStyle = FormBorderStyle.FixedDialog;
|
||||
MaximizeBox = false;
|
||||
MinimizeBox = false;
|
||||
Name = "StoreItemDisplay";
|
||||
StartPosition = FormStartPosition.CenterScreen;
|
||||
Text = "QtC.NET Client - Store Item";
|
||||
Load += StoreItemDisplay_Load;
|
||||
((System.ComponentModel.ISupportInitialize)pbItemThumbnail).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)pbCurrencyIcon).EndInit();
|
||||
ResumeLayout(false);
|
||||
PerformLayout();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private PictureBox pbItemThumbnail;
|
||||
private Label lblName;
|
||||
private Label lblDescription;
|
||||
private Button btnBuy;
|
||||
private PictureBox pbCurrencyIcon;
|
||||
private Label lblPrice;
|
||||
}
|
||||
}
|
||||
@ -1,99 +0,0 @@
|
||||
using QtCNETAPI.Dtos.User;
|
||||
using QtCNETAPI.Schema;
|
||||
using QtCNETAPI.Services;
|
||||
using QtCNETAPI.Services.ApiService;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace qtc_net_client_2.Forms
|
||||
{
|
||||
public partial class StoreItemDisplay : Form
|
||||
{
|
||||
private StoreItem StoreItem { get; set; }
|
||||
|
||||
private LoggingService _loggingService;
|
||||
private IApiService _apiService;
|
||||
public StoreItemDisplay(StoreItem item, LoggingService loggingService, IApiService apiService)
|
||||
{
|
||||
StoreItem = item;
|
||||
_loggingService = loggingService;
|
||||
_apiService = apiService;
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private async void StoreItemDisplay_Load(object sender, EventArgs e)
|
||||
{
|
||||
lblName.Text = StoreItem.Name;
|
||||
lblDescription.Text = StoreItem.Description;
|
||||
lblPrice.Text = StoreItem.Price.ToString("N0");
|
||||
|
||||
// does the user already own this item?
|
||||
var ownedItem = await _apiService.GetOwnedStoreItem(StoreItem.Id);
|
||||
if (ownedItem != null && ownedItem.Success && ownedItem.Data != null)
|
||||
{
|
||||
btnBuy.Enabled = false;
|
||||
btnBuy.Text = "Bought";
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
using HttpClient client = new();
|
||||
var response = await client.GetAsync(StoreItem.ThumbnailUrl);
|
||||
if (response != null && response.IsSuccessStatusCode)
|
||||
{
|
||||
using var stream = await response.Content.ReadAsStreamAsync();
|
||||
Image image = Image.FromStream(stream);
|
||||
stream.Dispose();
|
||||
pbItemThumbnail.Image = image;
|
||||
}
|
||||
else if (response != null) _loggingService.LogString($"Store Item Thumbnail Could Not Be Loaded Due To Status Code {response.StatusCode}");
|
||||
else _loggingService.LogString("Store Item Thumbnail Could Not Be Loaded");
|
||||
client.Dispose();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_loggingService.LogString("Store Item Thumbnail Could Not Be Loaded\n" + ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
private async void btnBuy_Click(object sender, EventArgs e)
|
||||
{
|
||||
Enabled = false;
|
||||
|
||||
// attempt to buy item
|
||||
var ownedStoreItem = await _apiService.BuyStoreItem(StoreItem.Id);
|
||||
if (ownedStoreItem != null && ownedStoreItem.Success)
|
||||
{
|
||||
Enabled = true;
|
||||
|
||||
var result = MessageBox.Show($"Successfully Bought '{StoreItem.Name}'! Would You Like To Wear It Now?", "Success!", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
|
||||
if (result == DialogResult.Yes)
|
||||
{
|
||||
// send an update dto that only updates the current users cosmetic
|
||||
UserUpdateInformationDto updateDto = new UserUpdateInformationDto
|
||||
{
|
||||
Id = _apiService.CurrentUser.Id,
|
||||
Bio = _apiService.CurrentUser.Bio,
|
||||
DateOfBirth = _apiService.CurrentUser.DateOfBirth,
|
||||
Username = _apiService.CurrentUser.Username,
|
||||
ProfileCosmeticId = StoreItem.Id
|
||||
};
|
||||
|
||||
await _apiService.UpdateUserInformationAsync(updateDto);
|
||||
DialogResult = DialogResult.Yes;
|
||||
}
|
||||
}
|
||||
else MessageBox.Show("We Weren't Able To Complete Your Purchase.\nYou May Not Have Enough Funds For This Item.", "Oops.", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
|
||||
DialogResult = DialogResult.OK;
|
||||
Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,123 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="lblDescription.Text" xml:space="preserve">
|
||||
<value>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum</value>
|
||||
</data>
|
||||
</root>
|
||||
457
qtc-net-client-2/Forms/TicTacToeGame.Designer.cs
generated
@ -1,457 +0,0 @@
|
||||
namespace qtc_net_client_2
|
||||
{
|
||||
partial class TicTacToeGame
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
pBoard = new Panel();
|
||||
btnSquare9 = new Button();
|
||||
btnSquare1 = new Button();
|
||||
btnSquare7 = new Button();
|
||||
btnSquare8 = new Button();
|
||||
btnSquare6 = new Button();
|
||||
btnSquare4 = new Button();
|
||||
btnSquare5 = new Button();
|
||||
btnSquare3 = new Button();
|
||||
btnSquare2 = new Button();
|
||||
pbBoard = new PictureBox();
|
||||
pSymbolSelection = new Panel();
|
||||
btnOSelect = new Button();
|
||||
btnXSelect = new Button();
|
||||
label1 = new Label();
|
||||
pLoading = new Panel();
|
||||
btnPlayAgain = new Button();
|
||||
lblPlayAgain = new Label();
|
||||
lblLoadStatus = new Label();
|
||||
lblPlayerOne = new Label();
|
||||
lblP1Username = new Label();
|
||||
lblP2Username = new Label();
|
||||
lblPlayerTwo = new Label();
|
||||
lvUserlist = new ListView();
|
||||
rtxtChatbox = new RichTextBox();
|
||||
btnSend = new Button();
|
||||
rtxtChat = new RichTextBox();
|
||||
lblJackpotWon = new Label();
|
||||
pBoard.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)pbBoard).BeginInit();
|
||||
pSymbolSelection.SuspendLayout();
|
||||
pLoading.SuspendLayout();
|
||||
SuspendLayout();
|
||||
//
|
||||
// pBoard
|
||||
//
|
||||
pBoard.Controls.Add(btnSquare9);
|
||||
pBoard.Controls.Add(btnSquare1);
|
||||
pBoard.Controls.Add(btnSquare7);
|
||||
pBoard.Controls.Add(btnSquare8);
|
||||
pBoard.Controls.Add(btnSquare6);
|
||||
pBoard.Controls.Add(btnSquare4);
|
||||
pBoard.Controls.Add(btnSquare5);
|
||||
pBoard.Controls.Add(btnSquare3);
|
||||
pBoard.Controls.Add(btnSquare2);
|
||||
pBoard.Controls.Add(pbBoard);
|
||||
pBoard.Enabled = false;
|
||||
pBoard.Location = new Point(30, 18);
|
||||
pBoard.Name = "pBoard";
|
||||
pBoard.Size = new Size(541, 474);
|
||||
pBoard.TabIndex = 0;
|
||||
//
|
||||
// btnSquare9
|
||||
//
|
||||
btnSquare9.BackgroundImageLayout = ImageLayout.Stretch;
|
||||
btnSquare9.FlatAppearance.BorderSize = 0;
|
||||
btnSquare9.FlatStyle = FlatStyle.Flat;
|
||||
btnSquare9.Location = new Point(374, 341);
|
||||
btnSquare9.Name = "btnSquare9";
|
||||
btnSquare9.Size = new Size(99, 90);
|
||||
btnSquare9.TabIndex = 11;
|
||||
btnSquare9.UseVisualStyleBackColor = true;
|
||||
btnSquare9.Click += btnSquareX_Click;
|
||||
//
|
||||
// btnSquare1
|
||||
//
|
||||
btnSquare1.BackgroundImageLayout = ImageLayout.Stretch;
|
||||
btnSquare1.FlatAppearance.BorderSize = 0;
|
||||
btnSquare1.FlatStyle = FlatStyle.Flat;
|
||||
btnSquare1.Location = new Point(79, 49);
|
||||
btnSquare1.Name = "btnSquare1";
|
||||
btnSquare1.Size = new Size(99, 90);
|
||||
btnSquare1.TabIndex = 4;
|
||||
btnSquare1.UseVisualStyleBackColor = true;
|
||||
btnSquare1.Click += btnSquareX_Click;
|
||||
//
|
||||
// btnSquare7
|
||||
//
|
||||
btnSquare7.BackgroundImageLayout = ImageLayout.Stretch;
|
||||
btnSquare7.FlatAppearance.BorderSize = 0;
|
||||
btnSquare7.FlatStyle = FlatStyle.Flat;
|
||||
btnSquare7.Location = new Point(79, 341);
|
||||
btnSquare7.Name = "btnSquare7";
|
||||
btnSquare7.Size = new Size(99, 90);
|
||||
btnSquare7.TabIndex = 10;
|
||||
btnSquare7.UseVisualStyleBackColor = true;
|
||||
btnSquare7.Click += btnSquareX_Click;
|
||||
//
|
||||
// btnSquare8
|
||||
//
|
||||
btnSquare8.BackgroundImageLayout = ImageLayout.Stretch;
|
||||
btnSquare8.FlatAppearance.BorderSize = 0;
|
||||
btnSquare8.FlatStyle = FlatStyle.Flat;
|
||||
btnSquare8.Location = new Point(229, 341);
|
||||
btnSquare8.Name = "btnSquare8";
|
||||
btnSquare8.Size = new Size(99, 90);
|
||||
btnSquare8.TabIndex = 9;
|
||||
btnSquare8.UseVisualStyleBackColor = true;
|
||||
btnSquare8.Click += btnSquareX_Click;
|
||||
//
|
||||
// btnSquare6
|
||||
//
|
||||
btnSquare6.BackgroundImageLayout = ImageLayout.Stretch;
|
||||
btnSquare6.FlatAppearance.BorderSize = 0;
|
||||
btnSquare6.FlatStyle = FlatStyle.Flat;
|
||||
btnSquare6.Location = new Point(374, 195);
|
||||
btnSquare6.Name = "btnSquare6";
|
||||
btnSquare6.Size = new Size(99, 90);
|
||||
btnSquare6.TabIndex = 8;
|
||||
btnSquare6.UseVisualStyleBackColor = true;
|
||||
btnSquare6.Click += btnSquareX_Click;
|
||||
//
|
||||
// btnSquare4
|
||||
//
|
||||
btnSquare4.BackgroundImageLayout = ImageLayout.Stretch;
|
||||
btnSquare4.FlatAppearance.BorderSize = 0;
|
||||
btnSquare4.FlatStyle = FlatStyle.Flat;
|
||||
btnSquare4.Location = new Point(79, 195);
|
||||
btnSquare4.Name = "btnSquare4";
|
||||
btnSquare4.Size = new Size(99, 90);
|
||||
btnSquare4.TabIndex = 7;
|
||||
btnSquare4.UseVisualStyleBackColor = true;
|
||||
btnSquare4.Click += btnSquareX_Click;
|
||||
//
|
||||
// btnSquare5
|
||||
//
|
||||
btnSquare5.BackgroundImageLayout = ImageLayout.Stretch;
|
||||
btnSquare5.FlatAppearance.BorderSize = 0;
|
||||
btnSquare5.FlatStyle = FlatStyle.Flat;
|
||||
btnSquare5.Location = new Point(229, 195);
|
||||
btnSquare5.Name = "btnSquare5";
|
||||
btnSquare5.Size = new Size(99, 90);
|
||||
btnSquare5.TabIndex = 6;
|
||||
btnSquare5.UseVisualStyleBackColor = true;
|
||||
btnSquare5.Click += btnSquareX_Click;
|
||||
//
|
||||
// btnSquare3
|
||||
//
|
||||
btnSquare3.BackgroundImageLayout = ImageLayout.Stretch;
|
||||
btnSquare3.FlatAppearance.BorderSize = 0;
|
||||
btnSquare3.FlatStyle = FlatStyle.Flat;
|
||||
btnSquare3.Location = new Point(374, 49);
|
||||
btnSquare3.Name = "btnSquare3";
|
||||
btnSquare3.Size = new Size(99, 90);
|
||||
btnSquare3.TabIndex = 5;
|
||||
btnSquare3.UseVisualStyleBackColor = true;
|
||||
btnSquare3.Click += btnSquareX_Click;
|
||||
//
|
||||
// btnSquare2
|
||||
//
|
||||
btnSquare2.BackgroundImageLayout = ImageLayout.Stretch;
|
||||
btnSquare2.FlatAppearance.BorderSize = 0;
|
||||
btnSquare2.FlatStyle = FlatStyle.Flat;
|
||||
btnSquare2.Location = new Point(229, 49);
|
||||
btnSquare2.Name = "btnSquare2";
|
||||
btnSquare2.Size = new Size(99, 90);
|
||||
btnSquare2.TabIndex = 3;
|
||||
btnSquare2.UseVisualStyleBackColor = true;
|
||||
btnSquare2.Click += btnSquareX_Click;
|
||||
//
|
||||
// pbBoard
|
||||
//
|
||||
pbBoard.Image = Properties.Resources.Tic_tac_toe;
|
||||
pbBoard.Location = new Point(27, 15);
|
||||
pbBoard.Name = "pbBoard";
|
||||
pbBoard.Size = new Size(501, 444);
|
||||
pbBoard.SizeMode = PictureBoxSizeMode.Zoom;
|
||||
pbBoard.TabIndex = 0;
|
||||
pbBoard.TabStop = false;
|
||||
//
|
||||
// pSymbolSelection
|
||||
//
|
||||
pSymbolSelection.BorderStyle = BorderStyle.FixedSingle;
|
||||
pSymbolSelection.Controls.Add(btnOSelect);
|
||||
pSymbolSelection.Controls.Add(btnXSelect);
|
||||
pSymbolSelection.Controls.Add(label1);
|
||||
pSymbolSelection.Location = new Point(161, 109);
|
||||
pSymbolSelection.Name = "pSymbolSelection";
|
||||
pSymbolSelection.Size = new Size(275, 255);
|
||||
pSymbolSelection.TabIndex = 3;
|
||||
pSymbolSelection.Visible = false;
|
||||
//
|
||||
// btnOSelect
|
||||
//
|
||||
btnOSelect.BackgroundImage = Properties.Resources.O;
|
||||
btnOSelect.BackgroundImageLayout = ImageLayout.Stretch;
|
||||
btnOSelect.FlatAppearance.BorderSize = 0;
|
||||
btnOSelect.FlatStyle = FlatStyle.Flat;
|
||||
btnOSelect.Location = new Point(157, 104);
|
||||
btnOSelect.Name = "btnOSelect";
|
||||
btnOSelect.Size = new Size(91, 89);
|
||||
btnOSelect.TabIndex = 2;
|
||||
btnOSelect.UseVisualStyleBackColor = true;
|
||||
btnOSelect.Click += btnOSelect_Click;
|
||||
//
|
||||
// btnXSelect
|
||||
//
|
||||
btnXSelect.BackgroundImage = Properties.Resources.X;
|
||||
btnXSelect.BackgroundImageLayout = ImageLayout.Stretch;
|
||||
btnXSelect.FlatAppearance.BorderSize = 0;
|
||||
btnXSelect.FlatStyle = FlatStyle.Flat;
|
||||
btnXSelect.Location = new Point(34, 103);
|
||||
btnXSelect.Name = "btnXSelect";
|
||||
btnXSelect.Size = new Size(91, 89);
|
||||
btnXSelect.TabIndex = 1;
|
||||
btnXSelect.UseVisualStyleBackColor = true;
|
||||
btnXSelect.Click += btnXSelect_Click;
|
||||
//
|
||||
// label1
|
||||
//
|
||||
label1.Font = new Font("Segoe UI", 15F, FontStyle.Bold, GraphicsUnit.Point, 0);
|
||||
label1.ForeColor = Color.White;
|
||||
label1.Location = new Point(11, 14);
|
||||
label1.Name = "label1";
|
||||
label1.Size = new Size(250, 49);
|
||||
label1.TabIndex = 0;
|
||||
label1.Text = "Please Select Symbol";
|
||||
label1.TextAlign = ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// pLoading
|
||||
//
|
||||
pLoading.BorderStyle = BorderStyle.FixedSingle;
|
||||
pLoading.Controls.Add(btnPlayAgain);
|
||||
pLoading.Controls.Add(lblPlayAgain);
|
||||
pLoading.Controls.Add(lblLoadStatus);
|
||||
pLoading.Location = new Point(161, 109);
|
||||
pLoading.Name = "pLoading";
|
||||
pLoading.Size = new Size(275, 255);
|
||||
pLoading.TabIndex = 2;
|
||||
pLoading.Visible = false;
|
||||
//
|
||||
// btnPlayAgain
|
||||
//
|
||||
btnPlayAgain.Location = new Point(97, 223);
|
||||
btnPlayAgain.Name = "btnPlayAgain";
|
||||
btnPlayAgain.Size = new Size(75, 23);
|
||||
btnPlayAgain.TabIndex = 2;
|
||||
btnPlayAgain.Text = "Play Again";
|
||||
btnPlayAgain.UseVisualStyleBackColor = true;
|
||||
btnPlayAgain.Visible = false;
|
||||
btnPlayAgain.Click += btnPlayAgain_Click;
|
||||
//
|
||||
// lblPlayAgain
|
||||
//
|
||||
lblPlayAgain.ForeColor = Color.White;
|
||||
lblPlayAgain.Location = new Point(28, 134);
|
||||
lblPlayAgain.Name = "lblPlayAgain";
|
||||
lblPlayAgain.Size = new Size(218, 86);
|
||||
lblPlayAgain.TabIndex = 1;
|
||||
lblPlayAgain.Text = "If you wish to play with a different user, you can close\r\nthis window and match up again. Otherwise click\r\n\"Play Again\"";
|
||||
lblPlayAgain.TextAlign = ContentAlignment.MiddleCenter;
|
||||
lblPlayAgain.Visible = false;
|
||||
//
|
||||
// lblLoadStatus
|
||||
//
|
||||
lblLoadStatus.Font = new Font("Segoe UI", 21.75F, FontStyle.Bold, GraphicsUnit.Point, 0);
|
||||
lblLoadStatus.ForeColor = Color.White;
|
||||
lblLoadStatus.Location = new Point(11, 4);
|
||||
lblLoadStatus.Name = "lblLoadStatus";
|
||||
lblLoadStatus.Size = new Size(250, 130);
|
||||
lblLoadStatus.TabIndex = 0;
|
||||
lblLoadStatus.Text = "Text";
|
||||
lblLoadStatus.TextAlign = ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// lblPlayerOne
|
||||
//
|
||||
lblPlayerOne.Font = new Font("Segoe UI", 12F, FontStyle.Bold | FontStyle.Italic);
|
||||
lblPlayerOne.ForeColor = Color.White;
|
||||
lblPlayerOne.Location = new Point(30, 501);
|
||||
lblPlayerOne.Name = "lblPlayerOne";
|
||||
lblPlayerOne.Size = new Size(29, 23);
|
||||
lblPlayerOne.TabIndex = 2;
|
||||
lblPlayerOne.Text = "P1";
|
||||
//
|
||||
// lblP1Username
|
||||
//
|
||||
lblP1Username.AutoSize = true;
|
||||
lblP1Username.Font = new Font("Segoe UI", 15F, FontStyle.Bold | FontStyle.Italic);
|
||||
lblP1Username.ForeColor = Color.White;
|
||||
lblP1Username.Location = new Point(26, 519);
|
||||
lblP1Username.Name = "lblP1Username";
|
||||
lblP1Username.Size = new Size(105, 28);
|
||||
lblP1Username.TabIndex = 3;
|
||||
lblP1Username.Text = "Username";
|
||||
//
|
||||
// lblP2Username
|
||||
//
|
||||
lblP2Username.AutoSize = true;
|
||||
lblP2Username.Font = new Font("Segoe UI", 15F, FontStyle.Bold | FontStyle.Italic);
|
||||
lblP2Username.ForeColor = Color.White;
|
||||
lblP2Username.Location = new Point(466, 519);
|
||||
lblP2Username.Name = "lblP2Username";
|
||||
lblP2Username.Size = new Size(105, 28);
|
||||
lblP2Username.TabIndex = 5;
|
||||
lblP2Username.Text = "Username";
|
||||
lblP2Username.TextAlign = ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lblPlayerTwo
|
||||
//
|
||||
lblPlayerTwo.Font = new Font("Segoe UI", 12F, FontStyle.Bold | FontStyle.Italic);
|
||||
lblPlayerTwo.ForeColor = Color.White;
|
||||
lblPlayerTwo.Location = new Point(540, 501);
|
||||
lblPlayerTwo.Name = "lblPlayerTwo";
|
||||
lblPlayerTwo.Size = new Size(29, 23);
|
||||
lblPlayerTwo.TabIndex = 4;
|
||||
lblPlayerTwo.Text = "P2";
|
||||
//
|
||||
// lvUserlist
|
||||
//
|
||||
lvUserlist.Alignment = ListViewAlignment.Left;
|
||||
lvUserlist.Location = new Point(577, 48);
|
||||
lvUserlist.MultiSelect = false;
|
||||
lvUserlist.Name = "lvUserlist";
|
||||
lvUserlist.Size = new Size(309, 211);
|
||||
lvUserlist.TabIndex = 6;
|
||||
lvUserlist.UseCompatibleStateImageBehavior = false;
|
||||
lvUserlist.View = View.SmallIcon;
|
||||
//
|
||||
// rtxtChatbox
|
||||
//
|
||||
rtxtChatbox.Location = new Point(577, 497);
|
||||
rtxtChatbox.Name = "rtxtChatbox";
|
||||
rtxtChatbox.Size = new Size(230, 49);
|
||||
rtxtChatbox.TabIndex = 8;
|
||||
rtxtChatbox.Text = "";
|
||||
rtxtChatbox.KeyDown += rtxtChatbox_KeyDown;
|
||||
//
|
||||
// btnSend
|
||||
//
|
||||
btnSend.BackgroundImage = Properties.Resources.SendIcon;
|
||||
btnSend.BackgroundImageLayout = ImageLayout.Zoom;
|
||||
btnSend.FlatAppearance.BorderSize = 0;
|
||||
btnSend.FlatStyle = FlatStyle.Flat;
|
||||
btnSend.Location = new Point(811, 497);
|
||||
btnSend.Name = "btnSend";
|
||||
btnSend.Size = new Size(75, 50);
|
||||
btnSend.TabIndex = 9;
|
||||
btnSend.UseVisualStyleBackColor = true;
|
||||
btnSend.Click += btnSend_Click;
|
||||
//
|
||||
// rtxtChat
|
||||
//
|
||||
rtxtChat.Font = new Font("Segoe UI", 10F);
|
||||
rtxtChat.HideSelection = false;
|
||||
rtxtChat.Location = new Point(577, 265);
|
||||
rtxtChat.Name = "rtxtChat";
|
||||
rtxtChat.ReadOnly = true;
|
||||
rtxtChat.Size = new Size(309, 227);
|
||||
rtxtChat.TabIndex = 10;
|
||||
rtxtChat.Text = "";
|
||||
//
|
||||
// lblJackpotWon
|
||||
//
|
||||
lblJackpotWon.AutoSize = true;
|
||||
lblJackpotWon.Font = new Font("Segoe UI", 12F, FontStyle.Bold | FontStyle.Italic);
|
||||
lblJackpotWon.ForeColor = Color.Blue;
|
||||
lblJackpotWon.Location = new Point(744, 18);
|
||||
lblJackpotWon.Name = "lblJackpotWon";
|
||||
lblJackpotWon.Size = new Size(142, 21);
|
||||
lblJackpotWon.TabIndex = 11;
|
||||
lblJackpotWon.Text = "3 Wins = Jackpot!";
|
||||
//
|
||||
// TicTacToeGame
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(7F, 15F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
BackColor = Color.DodgerBlue;
|
||||
ClientSize = new Size(898, 558);
|
||||
Controls.Add(lblJackpotWon);
|
||||
Controls.Add(rtxtChat);
|
||||
Controls.Add(btnSend);
|
||||
Controls.Add(rtxtChatbox);
|
||||
Controls.Add(lvUserlist);
|
||||
Controls.Add(lblP2Username);
|
||||
Controls.Add(lblPlayerTwo);
|
||||
Controls.Add(lblP1Username);
|
||||
Controls.Add(lblPlayerOne);
|
||||
Controls.Add(pLoading);
|
||||
Controls.Add(pSymbolSelection);
|
||||
Controls.Add(pBoard);
|
||||
FormBorderStyle = FormBorderStyle.FixedDialog;
|
||||
MaximizeBox = false;
|
||||
Name = "TicTacToeGame";
|
||||
StartPosition = FormStartPosition.CenterScreen;
|
||||
Text = "QtC.NET qGame - qTic-Tac-Toe";
|
||||
FormClosed += TicTacToeGame_FormClosed;
|
||||
Load += Main_Load;
|
||||
pBoard.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)pbBoard).EndInit();
|
||||
pSymbolSelection.ResumeLayout(false);
|
||||
pLoading.ResumeLayout(false);
|
||||
ResumeLayout(false);
|
||||
PerformLayout();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private Panel pBoard;
|
||||
private PictureBox pbBoard;
|
||||
private Button btnSquare9;
|
||||
private Button btnSquare7;
|
||||
private Button btnSquare8;
|
||||
private Button btnSquare6;
|
||||
private Button btnSquare4;
|
||||
private Button btnSquare5;
|
||||
private Button btnSquare3;
|
||||
private Button btnSquare1;
|
||||
private Button btnSquare2;
|
||||
private Panel pLoading;
|
||||
private Label lblLoadStatus;
|
||||
private Label lblPlayerOne;
|
||||
private Label lblP1Username;
|
||||
private Label lblP2Username;
|
||||
private Label lblPlayerTwo;
|
||||
private Panel pSymbolSelection;
|
||||
private Button btnOSelect;
|
||||
private Button btnXSelect;
|
||||
private Label label1;
|
||||
private ListView lvUserlist;
|
||||
private RichTextBox rtxtChatbox;
|
||||
private Button btnSend;
|
||||
private Label lblPlayAgain;
|
||||
private Button btnPlayAgain;
|
||||
private RichTextBox rtxtChat;
|
||||
private Label lblJackpotWon;
|
||||
}
|
||||
}
|
||||
@ -1,520 +0,0 @@
|
||||
using Microsoft.AspNetCore.SignalR.Client;
|
||||
using qtc_net_client_2.Forms;
|
||||
using qtc_net_client_2.Services;
|
||||
using QtCNETAPI.Enums;
|
||||
using QtCNETAPI.Models;
|
||||
using QtCNETAPI.Schema;
|
||||
using QtCNETAPI.Services.ApiService;
|
||||
using System.Threading.Tasks;
|
||||
using qtc_net_client_2.ClientModel;
|
||||
|
||||
namespace qtc_net_client_2
|
||||
{
|
||||
public partial class TicTacToeGame : Form
|
||||
{
|
||||
private HubConnection? GameHubConnection { get; set; }
|
||||
private GameRoom? CurrentRoom { get; set; }
|
||||
|
||||
private IApiService _apiService;
|
||||
private Config _config;
|
||||
private AudioService _audioService = new();
|
||||
|
||||
private int WinCount { get; set; }
|
||||
private bool JackpotWon { get; set; } = false;
|
||||
public TicTacToeGame(IApiService apiService, Config config)
|
||||
{
|
||||
_apiService = apiService;
|
||||
_config = config;
|
||||
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private async void Main_Load(object sender, EventArgs e)
|
||||
{
|
||||
// first, connect to the game hub
|
||||
GameHubConnection = new HubConnectionBuilder()
|
||||
.WithUrl($"{_config.ServerUrl}/tttgame", options =>
|
||||
{
|
||||
options.AccessTokenProvider = () => Task.FromResult(_apiService.SessionToken)!;
|
||||
})
|
||||
.WithAutomaticReconnect()
|
||||
.Build();
|
||||
|
||||
pLoading.Visible = true;
|
||||
lblLoadStatus.Text = "Connecting\nTo\nHub...";
|
||||
|
||||
GameHubConnection.On<GameRoom>("WaitingForPlayer", (room) =>
|
||||
{
|
||||
CurrentRoom = room;
|
||||
|
||||
BeginInvoke(delegate ()
|
||||
{
|
||||
if (room.Player1 != null)
|
||||
{
|
||||
lblP1Username.Text = room.Player1.Username;
|
||||
lvUserlist.Items.Add(room.Player1.Id, room.Player1.Username, room.Player1.Status);
|
||||
}
|
||||
|
||||
lblLoadStatus.Text = "Waiting\nFor\nPlayer...";
|
||||
});
|
||||
});
|
||||
|
||||
GameHubConnection.On<GameRoom>("GameStart", (room) =>
|
||||
{
|
||||
CurrentRoom = room;
|
||||
|
||||
BeginInvoke(delegate ()
|
||||
{
|
||||
pLoading.Visible = false;
|
||||
pSymbolSelection.Visible = false;
|
||||
});
|
||||
});
|
||||
|
||||
GameHubConnection.On<GameRoom, string?>("GameEnd", (room, usernameDisconnected) =>
|
||||
{
|
||||
CurrentRoom = room;
|
||||
|
||||
BeginInvoke(delegate ()
|
||||
{
|
||||
if (room.Player1 == null) lblP1Username.Text = "Username";
|
||||
if (room.Player2 == null) lblP2Username.Text = "Username";
|
||||
|
||||
ToggleBoardControl(false);
|
||||
|
||||
switch (room.Status)
|
||||
{
|
||||
case GameStatus.P1Win:
|
||||
{
|
||||
if (_apiService.CurrentUser.Id == room.Player1?.Id)
|
||||
{
|
||||
lblLoadStatus.Text = "You Won!";
|
||||
WinCount++;
|
||||
|
||||
if (WinCount >= 3)
|
||||
{
|
||||
JackpotWon = true;
|
||||
lblJackpotWon.Text = "You Won A Spin!";
|
||||
}
|
||||
}
|
||||
else lblLoadStatus.Text = "You Lost!";
|
||||
lblPlayAgain.Visible = true;
|
||||
btnPlayAgain.Visible = true;
|
||||
break;
|
||||
}
|
||||
case GameStatus.P2Win:
|
||||
{
|
||||
if (_apiService.CurrentUser.Id == room.Player2?.Id)
|
||||
{
|
||||
lblLoadStatus.Text = "You Won!";
|
||||
WinCount++;
|
||||
|
||||
if (WinCount >= 3)
|
||||
{
|
||||
JackpotWon = true;
|
||||
lblJackpotWon.Text = "You Won A Spin!";
|
||||
}
|
||||
}
|
||||
else lblLoadStatus.Text = "You Lost!";
|
||||
lblPlayAgain.Visible = true;
|
||||
btnPlayAgain.Visible = true;
|
||||
break;
|
||||
}
|
||||
case GameStatus.PlayerDisconnected:
|
||||
{
|
||||
if (!string.IsNullOrEmpty(usernameDisconnected))
|
||||
lblLoadStatus.Text = $"Game Ended.\nUser {usernameDisconnected}\nDisconnected.";
|
||||
lblPlayAgain.Visible = false;
|
||||
btnPlayAgain.Visible = false;
|
||||
break;
|
||||
}
|
||||
case GameStatus.NoWin:
|
||||
lblLoadStatus.Text = "It's a draw!";
|
||||
lblPlayAgain.Visible = true;
|
||||
btnPlayAgain.Visible = true;
|
||||
break;
|
||||
}
|
||||
|
||||
pLoading.Visible = true;
|
||||
});
|
||||
});
|
||||
|
||||
GameHubConnection.On<GameRoom>("RestartGame", (room) =>
|
||||
{
|
||||
CurrentRoom = room;
|
||||
|
||||
BeginInvoke(delegate ()
|
||||
{
|
||||
if (pLoading.Visible) pLoading.Visible = false;
|
||||
});
|
||||
ClearBoard();
|
||||
ToggleBoardControl(true);
|
||||
|
||||
BeginInvoke(delegate ()
|
||||
{
|
||||
List<Button> buttons = [btnSquare1, btnSquare2, btnSquare3, btnSquare4, btnSquare5, btnSquare6, btnSquare7, btnSquare8, btnSquare9];
|
||||
|
||||
foreach (Button button in buttons)
|
||||
{
|
||||
if (button.BackgroundImage == null)
|
||||
button.Enabled = true;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
GameHubConnection.On<GameRoom>("SelectSymbol", (room) =>
|
||||
{
|
||||
CurrentRoom = room;
|
||||
|
||||
BeginInvoke(delegate ()
|
||||
{
|
||||
if (room.Player1 != null)
|
||||
{
|
||||
lblP1Username.Text = room.Player1.Username;
|
||||
if (!lvUserlist.Items.ContainsKey(room.Player1.Id)) lvUserlist.Items.Add(room.Player1.Id, room.Player1.Username, room.Player1.Status);
|
||||
}
|
||||
if (room.Player2 != null)
|
||||
{
|
||||
lblP2Username.Text = room.Player2.Username;
|
||||
if (!lvUserlist.Items.ContainsKey(room.Player2.Id)) lvUserlist.Items.Add(room.Player2.Id, room.Player2.Username, room.Player2.Status);
|
||||
}
|
||||
|
||||
if (pLoading.Visible) pLoading.Visible = false;
|
||||
pSymbolSelection.Visible = true;
|
||||
pBoard.Enabled = true;
|
||||
ToggleAllSquareButtons(false);
|
||||
});
|
||||
});
|
||||
|
||||
GameHubConnection.On<GameRoom>("SelectingSymbol", (room) =>
|
||||
{
|
||||
CurrentRoom = room;
|
||||
|
||||
BeginInvoke(delegate ()
|
||||
{
|
||||
if (pSymbolSelection.Visible) return;
|
||||
|
||||
if (room.Player1 != null)
|
||||
{
|
||||
lblP1Username.Text = room.Player1.Username;
|
||||
if (!lvUserlist.Items.ContainsKey(room.Player1.Id)) lvUserlist.Items.Add(room.Player1.Id, room.Player1.Username, room.Player1.Status);
|
||||
}
|
||||
if (room.Player2 != null)
|
||||
{
|
||||
lblP2Username.Text = room.Player2.Username;
|
||||
if (!lvUserlist.Items.ContainsKey(room.Player2.Id)) lvUserlist.Items.Add(room.Player2.Id, room.Player2.Username, room.Player2.Status);
|
||||
}
|
||||
|
||||
pLoading.Visible = true;
|
||||
lblLoadStatus.Text = $"Player 1\nIs Selecting\nSymbol...";
|
||||
});
|
||||
});
|
||||
|
||||
GameHubConnection.On<GameRoom, TicTacToeMove>("UpdateBoard", (room, move) =>
|
||||
{
|
||||
CurrentRoom = room;
|
||||
|
||||
UpdateBoardUI(move);
|
||||
});
|
||||
|
||||
GameHubConnection.On<GameRoom>("StartTurn", (room) =>
|
||||
{
|
||||
CurrentRoom = room;
|
||||
ToggleBoardControl(true);
|
||||
AddChatMessage("[SERVER] Your Turn!");
|
||||
});
|
||||
|
||||
GameHubConnection.On<GameRoom>("EndTurn", (room) =>
|
||||
{
|
||||
CurrentRoom = room;
|
||||
ToggleBoardControl(false);
|
||||
AddChatMessage("[SERVER] Other Players Turn");
|
||||
});
|
||||
|
||||
GameHubConnection.On<string>("ReceiveMessage", (msg) =>
|
||||
{
|
||||
AddChatMessage(msg);
|
||||
if (msg.Split('[')[1] != _apiService.CurrentUser.Username)
|
||||
_audioService.PlaySoundEffect("sndMessage");
|
||||
});
|
||||
|
||||
try { await GameHubConnection.StartAsync(); }
|
||||
catch (HttpRequestException ex)
|
||||
{
|
||||
MessageBox.Show($"Sorry, We Couldn't Connect To The Game Server Due To An Error. Please Try Again Later.\n\n{ex.Message}", "Oops.", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
Environment.Exit(0);
|
||||
}
|
||||
|
||||
lblLoadStatus.Text = "Finding\nRoom...";
|
||||
await GameHubConnection.SendAsync("FindRoom");
|
||||
}
|
||||
|
||||
private async void TicTacToeGame_FormClosed(object sender, FormClosedEventArgs e)
|
||||
{
|
||||
if (GameHubConnection != null && GameHubConnection.State == HubConnectionState.Connected)
|
||||
{
|
||||
if(JackpotWon)
|
||||
{
|
||||
// start a jackpot spin
|
||||
CurrencyJackpotSpinner currencyJackpotSpinner = new CurrencyJackpotSpinner();
|
||||
var dialogResult = currencyJackpotSpinner.ShowDialog();
|
||||
if (dialogResult == DialogResult.OK)
|
||||
{
|
||||
await _apiService.AddCurrencyToCurrentUser(currencyJackpotSpinner.TokensWon, false);
|
||||
_apiService.CurrentUser.CurrencyAmount += currencyJackpotSpinner.TokensWon;
|
||||
}
|
||||
}
|
||||
|
||||
// stop and dispose connection
|
||||
await GameHubConnection.StopAsync();
|
||||
await GameHubConnection.DisposeAsync();
|
||||
GameHubConnection = null;
|
||||
}
|
||||
}
|
||||
|
||||
private async void btnXSelect_Click(object sender, EventArgs e) => await SelectSymbol(TicTacToeSymbol.X);
|
||||
private async void btnOSelect_Click(object sender, EventArgs e) => await SelectSymbol(TicTacToeSymbol.O);
|
||||
|
||||
private async void btnPlayAgain_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (GameHubConnection != null && GameHubConnection.State == HubConnectionState.Connected && CurrentRoom != null)
|
||||
{
|
||||
await GameHubConnection.SendAsync("RestartGame", CurrentRoom.Id);
|
||||
}
|
||||
}
|
||||
|
||||
private async void btnSquareX_Click(object sender, EventArgs e)
|
||||
{
|
||||
// create move
|
||||
TicTacToeMove move = new TicTacToeMove
|
||||
{
|
||||
User = _apiService.CurrentUser
|
||||
};
|
||||
|
||||
if (sender is Button btn)
|
||||
{
|
||||
switch (btn.Name)
|
||||
{
|
||||
case "btnSquare1":
|
||||
move.Point = 1;
|
||||
break;
|
||||
case "btnSquare2":
|
||||
move.Point = 2;
|
||||
break;
|
||||
case "btnSquare3":
|
||||
move.Point = 3;
|
||||
break;
|
||||
case "btnSquare4":
|
||||
move.Point = 4;
|
||||
break;
|
||||
case "btnSquare5":
|
||||
move.Point = 5;
|
||||
break;
|
||||
case "btnSquare6":
|
||||
move.Point = 6;
|
||||
break;
|
||||
case "btnSquare7":
|
||||
move.Point = 7;
|
||||
break;
|
||||
case "btnSquare8":
|
||||
move.Point = 8;
|
||||
break;
|
||||
case "btnSquare9":
|
||||
move.Point = 9;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// send move
|
||||
if (GameHubConnection != null && GameHubConnection.State == HubConnectionState.Connected && CurrentRoom != null)
|
||||
await GameHubConnection.SendAsync("MakeMove", CurrentRoom.Id, move);
|
||||
}
|
||||
|
||||
private async void btnSend_Click(object sender, EventArgs e)
|
||||
{
|
||||
if ((GameHubConnection != null && GameHubConnection.State == HubConnectionState.Connected && CurrentRoom != null) &&
|
||||
!string.IsNullOrWhiteSpace(rtxtChatbox.Text))
|
||||
{
|
||||
await GameHubConnection.SendAsync("SendRoomMessage", CurrentRoom.Id, $"[{_apiService.CurrentUser.Username}] {rtxtChatbox.Text}");
|
||||
_audioService.PlaySoundEffect("sndSendClick");
|
||||
rtxtChatbox.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
private void rtxtChatbox_KeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
if(e.KeyCode == Keys.Enter)
|
||||
btnSend_Click(sender, e);
|
||||
}
|
||||
|
||||
private void ToggleBoardControl(bool toggle)
|
||||
{
|
||||
if (IsHandleCreated && !IsDisposed)
|
||||
{
|
||||
Invoke(delegate ()
|
||||
{
|
||||
pBoard.Enabled = toggle;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void ToggleAllSquareButtons(bool toggle)
|
||||
{
|
||||
if (IsHandleCreated && !IsDisposed)
|
||||
{
|
||||
Invoke(delegate ()
|
||||
{
|
||||
List<Button> buttons = [btnSquare1, btnSquare2, btnSquare3, btnSquare4, btnSquare5, btnSquare6, btnSquare7, btnSquare8, btnSquare9];
|
||||
|
||||
foreach (Button button in buttons)
|
||||
button.Enabled = toggle;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private async Task SelectSymbol(TicTacToeSymbol symbol)
|
||||
{
|
||||
if (GameHubConnection != null && GameHubConnection.State == HubConnectionState.Connected && CurrentRoom != null)
|
||||
{
|
||||
await GameHubConnection.SendAsync("SetSymbol", CurrentRoom.Id, symbol);
|
||||
ToggleAllSquareButtons(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateBoardUI(TicTacToeMove move)
|
||||
{
|
||||
if (IsHandleCreated && !IsDisposed && CurrentRoom != null)
|
||||
{
|
||||
// play move made sound
|
||||
_audioService.PlaySoundEffect("sndTTTMoveMade");
|
||||
|
||||
Invoke(delegate ()
|
||||
{
|
||||
switch (CurrentRoom.Board.Square1)
|
||||
{
|
||||
case TicTacToeSymbol.X:
|
||||
btnSquare1.BackgroundImage = Properties.Resources.X;
|
||||
btnSquare1.Enabled = false;
|
||||
break;
|
||||
case TicTacToeSymbol.O:
|
||||
btnSquare1.BackgroundImage = Properties.Resources.O;
|
||||
btnSquare1.Enabled = false;
|
||||
break;
|
||||
}
|
||||
switch (CurrentRoom.Board.Square2)
|
||||
{
|
||||
case TicTacToeSymbol.X:
|
||||
btnSquare2.BackgroundImage = Properties.Resources.X;
|
||||
btnSquare2.Enabled = false;
|
||||
break;
|
||||
case TicTacToeSymbol.O:
|
||||
btnSquare2.BackgroundImage = Properties.Resources.O;
|
||||
btnSquare2.Enabled = false;
|
||||
break;
|
||||
}
|
||||
switch (CurrentRoom.Board.Square3)
|
||||
{
|
||||
case TicTacToeSymbol.X:
|
||||
btnSquare3.BackgroundImage = Properties.Resources.X;
|
||||
btnSquare3.Enabled = false;
|
||||
break;
|
||||
case TicTacToeSymbol.O:
|
||||
btnSquare3.BackgroundImage = Properties.Resources.O;
|
||||
btnSquare3.Enabled = false;
|
||||
break;
|
||||
}
|
||||
switch (CurrentRoom.Board.Square4)
|
||||
{
|
||||
case TicTacToeSymbol.X:
|
||||
btnSquare4.BackgroundImage = Properties.Resources.X;
|
||||
btnSquare4.Enabled = false;
|
||||
break;
|
||||
case TicTacToeSymbol.O:
|
||||
btnSquare4.BackgroundImage = Properties.Resources.O;
|
||||
btnSquare4.Enabled = false;
|
||||
break;
|
||||
}
|
||||
switch (CurrentRoom.Board.Square5)
|
||||
{
|
||||
case TicTacToeSymbol.X:
|
||||
btnSquare5.BackgroundImage = Properties.Resources.X;
|
||||
btnSquare5.Enabled = false;
|
||||
break;
|
||||
case TicTacToeSymbol.O:
|
||||
btnSquare5.BackgroundImage = Properties.Resources.O;
|
||||
btnSquare5.Enabled = false;
|
||||
break;
|
||||
}
|
||||
switch (CurrentRoom.Board.Square6)
|
||||
{
|
||||
case TicTacToeSymbol.X:
|
||||
btnSquare6.BackgroundImage = Properties.Resources.X;
|
||||
btnSquare6.Enabled = false;
|
||||
break;
|
||||
case TicTacToeSymbol.O:
|
||||
btnSquare6.BackgroundImage = Properties.Resources.O;
|
||||
btnSquare6.Enabled = false;
|
||||
break;
|
||||
}
|
||||
switch (CurrentRoom.Board.Square7)
|
||||
{
|
||||
case TicTacToeSymbol.X:
|
||||
btnSquare7.BackgroundImage = Properties.Resources.X;
|
||||
btnSquare7.Enabled = false;
|
||||
break;
|
||||
case TicTacToeSymbol.O:
|
||||
btnSquare7.BackgroundImage = Properties.Resources.O;
|
||||
btnSquare7.Enabled = false;
|
||||
break;
|
||||
}
|
||||
switch (CurrentRoom.Board.Square8)
|
||||
{
|
||||
case TicTacToeSymbol.X:
|
||||
btnSquare8.BackgroundImage = Properties.Resources.X;
|
||||
btnSquare8.Enabled = false;
|
||||
break;
|
||||
case TicTacToeSymbol.O:
|
||||
btnSquare8.BackgroundImage = Properties.Resources.O;
|
||||
btnSquare8.Enabled = false;
|
||||
break;
|
||||
}
|
||||
switch (CurrentRoom.Board.Square9)
|
||||
{
|
||||
case TicTacToeSymbol.X:
|
||||
btnSquare9.BackgroundImage = Properties.Resources.X;
|
||||
btnSquare9.Enabled = false;
|
||||
break;
|
||||
case TicTacToeSymbol.O:
|
||||
btnSquare9.BackgroundImage = Properties.Resources.O;
|
||||
btnSquare9.Enabled = false;
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void AddChatMessage(string msg)
|
||||
{
|
||||
if (IsHandleCreated && !IsDisposed)
|
||||
{
|
||||
Invoke(delegate ()
|
||||
{
|
||||
rtxtChat.AppendText($"{msg}\n");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void ClearBoard()
|
||||
{
|
||||
if (IsHandleCreated && !IsDisposed)
|
||||
{
|
||||
Invoke(delegate ()
|
||||
{
|
||||
List<Button> buttons = [btnSquare1, btnSquare2, btnSquare3, btnSquare4, btnSquare5, btnSquare6, btnSquare7, btnSquare8, btnSquare9];
|
||||
|
||||
foreach (Button button in buttons)
|
||||
button.BackgroundImage = null;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,120 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
@ -1,6 +1,5 @@
|
||||
using qtc_net_client_2.ClientModel;
|
||||
using qtc_net_client_2.Services;
|
||||
using QtCNETAPI.Services;
|
||||
using QtCNETAPI.Services.ApiService;
|
||||
using QtCNETAPI.Services.GatewayService;
|
||||
using System.Text.Json;
|
||||
@ -24,7 +23,8 @@ namespace qtc_net_client_2
|
||||
if(System.Diagnostics.Debugger.IsAttached)
|
||||
{
|
||||
// use localhost
|
||||
clientConfig.ServerUrl = "http://localhost:5268";
|
||||
clientConfig.ApiEndpoint = "http://localhost:5268/api";
|
||||
clientConfig.GatewayEndpoint = "http://localhost:5268/chat";
|
||||
}
|
||||
|
||||
// find config file
|
||||
@ -53,8 +53,8 @@ namespace qtc_net_client_2
|
||||
|
||||
// instantiate new ApiService and GatewayService for this session
|
||||
// this will keep the gateway thread in the main thread (i think)
|
||||
IApiService api = new ApiService($"{clientConfig.ServerUrl}/api", loggingService);
|
||||
IGatewayService gateway = new GatewayService($"{clientConfig.ServerUrl}/chat", api, loggingService);
|
||||
IApiService api = new ApiService(clientConfig.ApiEndpoint);
|
||||
IGatewayService gateway = new GatewayService(clientConfig.GatewayEndpoint, api);
|
||||
|
||||
// ping api
|
||||
var pingResult = await api.PingServerAsync();
|
||||
|
||||
74
qtc-net-client-2/Properties/Resources.Designer.cs
generated
@ -19,7 +19,7 @@ namespace qtc_net_client_2.Properties {
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "18.0.0.0")]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Resources {
|
||||
@ -81,7 +81,7 @@ namespace qtc_net_client_2.Properties {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to 6.5.5.
|
||||
/// Looks up a localized string similar to 5.0.
|
||||
/// </summary>
|
||||
internal static string AssemblyVersion {
|
||||
get {
|
||||
@ -109,16 +109,6 @@ namespace qtc_net_client_2.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap cobalt_sittingatputer {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("cobalt_sittingatputer", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
@ -169,16 +159,6 @@ namespace qtc_net_client_2.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap donatebtn {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("donatebtn", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
@ -209,16 +189,6 @@ namespace qtc_net_client_2.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap O {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("O", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
@ -269,16 +239,6 @@ namespace qtc_net_client_2.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap RoomsChatIcon {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("RoomsChatIcon", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
@ -288,35 +248,5 @@ namespace qtc_net_client_2.Properties {
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap support_me_on_kofi_badge_blue {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("support_me_on_kofi_badge_blue", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap Tic_tac_toe {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("Tic-tac-toe", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap X {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("X", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -124,21 +124,15 @@
|
||||
<data name="SendIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Icons\SendIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="X" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\X.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="left-horn-animated" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Anims\left-horn-animated.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="DefaultPfp" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\DefaultPfp.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="OfflineIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Icons\OfflineIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="dollar-money" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Anims\dollar-money.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="Tic-tac-toe" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\Tic-tac-toe1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="OnlineIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Icons\OnlineIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
@ -160,12 +154,6 @@
|
||||
<data name="RequestSentIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Icons\RequestSentIcon.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name="support_me_on_kofi_badge_blue" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\support_me_on_kofi_badge_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="O" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\O.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="RemoveContactIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Icons\RemoveContactIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
@ -173,10 +161,7 @@
|
||||
<value>..\Icons\MessageIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="AssemblyVersion" xml:space="preserve">
|
||||
<value>6.5.5</value>
|
||||
</data>
|
||||
<data name="cobalt_sittingatputer" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\cobalt_sittingatputer.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
<value>5.0</value>
|
||||
</data>
|
||||
<data name="LoginBanner" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\LoginBanner.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
@ -184,16 +169,10 @@
|
||||
<data name="DeclineContactIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Icons\DeclineContactIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="donatebtn" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\donatebtn.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="AcceptContactIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Icons\AcceptContactIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="DefaultPfp" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\DefaultPfp.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="RoomsChatIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Icons\RoomsChatIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
<data name="dollar-money" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Anims\dollar-money.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
</root>
|
||||
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 8.5 KiB |
|
Before Width: | Height: | Size: 24 KiB |
@ -1,40 +0,0 @@
|
||||
using qtc_net_client_2.Properties;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace qtc_net_client_2.Services
|
||||
{
|
||||
public class ImageFactory
|
||||
{
|
||||
public Bitmap CreateProfileImage(Bitmap? precenseImage = null, Bitmap? pfp = null, Bitmap? cosmetic = null)
|
||||
{
|
||||
Bitmap combined = new Bitmap(139, 138);
|
||||
|
||||
using Graphics g = Graphics.FromImage(combined);
|
||||
g.Clear(Color.Transparent);
|
||||
g.CompositingMode = CompositingMode.SourceOver;
|
||||
|
||||
pfp ??= Resources.DefaultPfp;
|
||||
|
||||
g.DrawImage(pfp, 4, 6, 128, 128);
|
||||
|
||||
if (cosmetic != null)
|
||||
{
|
||||
cosmetic.MakeTransparent();
|
||||
g.DrawImage(cosmetic, 0, 0, 139, 138);
|
||||
}
|
||||
|
||||
if(precenseImage != null)
|
||||
{
|
||||
precenseImage.MakeTransparent();
|
||||
g.DrawImage(precenseImage, 104, 0, 35, 35);
|
||||
}
|
||||
|
||||
return combined;
|
||||
}
|
||||
}
|
||||
}
|
||||
52
qtc-net-client-2/Services/LoggingService.cs
Normal file
@ -0,0 +1,52 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Diagnostics;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace qtc_net_client_2.Services
|
||||
{
|
||||
public class LoggingService : IDisposable
|
||||
{
|
||||
private DateTime LogDate { get; set; }
|
||||
private string LogFilePath { get; set; }
|
||||
private StreamWriter LogFile { get; set; }
|
||||
public LoggingService()
|
||||
{
|
||||
LogDate = DateTime.Now;
|
||||
LogFilePath = $"./Logs/QtCClientLog_{LogDate.ToString("ddMMyyy-hhmm")}.log";
|
||||
|
||||
// create log file
|
||||
|
||||
if (!Directory.Exists("./Logs")) Directory.CreateDirectory("./Logs");
|
||||
LogFile = new StreamWriter(File.Create(LogFilePath));
|
||||
|
||||
Debug.WriteLine($"Log File Created At {LogFilePath}");
|
||||
}
|
||||
|
||||
public void LogString(string message)
|
||||
{
|
||||
Debug.WriteLine($"({DateTime.Now.ToLocalTime().ToString("hh:mm")}) {message}");
|
||||
LogFile.WriteLine($"({DateTime.Now.ToLocalTime().ToString("hh:mm")}) {message}");
|
||||
}
|
||||
|
||||
public void LogModel<T>(T model)
|
||||
{
|
||||
// serialize the model as json
|
||||
string modelSerialized = JsonSerializer.Serialize(model, options: new JsonSerializerOptions { WriteIndented = true });
|
||||
|
||||
// log it
|
||||
Debug.WriteLine($"({DateTime.Now.ToLocalTime().ToString("hh:mm")}) {modelSerialized}");
|
||||
LogFile.WriteLine($"({DateTime.Now.ToLocalTime().ToString("hh:mm")}) {modelSerialized}");
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
LogFile.WriteLine("--- END OF LOG ---");
|
||||
LogFile.Close();
|
||||
LogFile.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -68,9 +68,6 @@ namespace qtc_net_client_2.Services
|
||||
|
||||
try
|
||||
{
|
||||
// if bak file already exists, delete it
|
||||
if (File.Exists($"/{updateInfo.ClientFileName}.bak")) File.Delete($"/{updateInfo.ClientFileName}.bak");
|
||||
|
||||
// move old client to backup file
|
||||
File.Move($"./{updateInfo.ClientFileName}", $"{updateInfo.ClientFileName}.bak");
|
||||
|
||||
|
||||
@ -62,9 +62,6 @@
|
||||
<None Update="Sounds\sndTokenWin.wav">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Update="Sounds\sndTTTMoveMade.wav">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||