1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DSACore.DSA_Game.Characters;
using DSACore.FireBase;
using DSACore.Models;
using DSACore.Models.Network;
using Microsoft.AspNetCore.SignalR;
namespace DSACore.Hubs
{
public class ChatHub : Hub
{
//private static Dictionary<string, User> UserGroup = new Dictionary<string, User>();
private static List<Group> DSAGroups = new List<Group>();
static ChatHub()
{
DSAGroups = Database.GetGroups().Result;
//AddGroups();
}
private static async void AddGroups()
{
await Database.AddGroup(new Models.Database.Group { Name = "HalloWelt", Password = "valid" });
await Database.AddGroup(new Models.Database.Group { Name = "Die Krassen Gamer", Password = "valid" });
await Database.AddGroup(new Models.Database.Group { Name = "DSA", Password = "valid" });
await Database.AddGroup(new Models.Database.Group { Name = "Die Überhelden", Password = "valid" });
}
public async Task SendMessage(string user, string message)
{
var args = message.Split(' ', StringSplitOptions.RemoveEmptyEntries).ToList();
var ident = args.First().Replace("!", "");
if(args.Count>0){args.RemoveAt(0);}
try
{
string group = getGroup(Context.ConnectionId).Name;
await SendToGroup(Commands.CommandHandler.ExecuteCommand(new Command { CharId = 0, CmdIdentifier = ident, CmdTexts = args, Name = user }));
}
catch(InvalidOperationException e)
{
await Clients.Caller.SendCoreAsync("ReceiveMessage", new object[] {"Nutzer ist in keiner Gruppe. Erst joinen!"});
}
}
private Task SendToGroup(string message)
{
string group = getGroup(Context.ConnectionId).Name;
return Clients.Group(group).SendCoreAsync("ReceiveMessage", new object[] { getUser(Context.ConnectionId), message });
}
private Models.Network.Group getGroup(string id)
{
return DSAGroups.First(x => x.Users.Exists(y => y.ConnectionId.Equals(id)));
}
private User getUser(string id)
{
return DSAGroups.First(x => x.Users.Exists(y => y.ConnectionId.Equals(id))).Users.First(z => z.ConnectionId.Equals(id));
}
public async Task GetGroups()
{
var test = Database.GetGroups();
test.Wait();
foreach (var group in test.Result)
{
if (!DSAGroups.Exists(x => x.Name.Equals(group.Name)))
{
DSAGroups.Add(group);
}
}
await Clients.Caller.SendCoreAsync("ListGroups", new object[] { DSAGroups });
//throw new NotImplementedException("add database call to get groups");
}
public async Task AddGroup(string group, string password)
{
DSAGroups.Add(new Group(group, password));
var Dgroup = new DSACore.Models.Database.Group{Name = group, Id = DSAGroups.Count-1};
//Database.AddGroup(Dgroup);
await Clients.Caller.SendCoreAsync("ReceiveMessage", new[] {$"group {@group} sucessfully added"});
//throw new NotImplementedException("add database call to add groups");
}
public async Task UploadChar(string xml)
{
var group = getGroup(Context.ConnectionId);
Database.AddChar(new Character(new MemoryStream(Encoding.UTF8.GetBytes(xml))), group);
//throw new NotImplementedException("add database call to add groups");
}
public async Task Login(string group, string user, string password)
{
if (password == DSAGroups.First(x=>x.Name == group).Password)
{
DSAGroups.First(x=>x.Name.Equals(group)).Users.Add(new User{ConnectionId = Context.ConnectionId, Name = user});
await Groups.AddToGroupAsync(Context.ConnectionId, group);
}
await SendToGroup("Ein neuer Nutzer hat die Gruppe betreten");
}
public async Task Disconnect()
{
var group = getGroup(Context.ConnectionId);
await SendToGroup("Connection lost");
var user = getUser(Context.ConnectionId);
group.Users.Remove(user);
await Groups.RemoveFromGroupAsync(Context.ConnectionId, group.Name);
}
}
}
|