Skip to content
This repository has been archived by the owner on Mar 22, 2019. It is now read-only.

Commit

Permalink
I nearly dont even care anymore
Browse files Browse the repository at this point in the history
  • Loading branch information
vainamov committed Mar 12, 2019
1 parent 820385a commit 7185587
Showing 1 changed file with 43 additions and 38 deletions.
81 changes: 43 additions & 38 deletions ConversationPlugin/ConversationPlugin.cs
Expand Up @@ -24,7 +24,10 @@ public class ConversationPlugin : Plugin

[EventListener(EventType.BeforeChannelJoin)]
public override async Task OnBeforeChannelJoin(Before<JoinElementEventArgs<Channel>> args) {
if (args.Event.Element.Attributes.ContainsKey("neo.origin") && args.Event.Element.Attributes["neo.origin"].ToString() == Namespace && args.Event.Element.Id.StartsWith("~conversation-")) {
Logger.Instance.Log(LogLevel.Debug, "Channel join by " + args.Event.Joiner.Identity.Id + " in " + args.Event.Element.Id);
conversations.FindAll(_ => _.Users.Contains(args.Event.Joiner.InternalId)).ForEach(_ => _.Channel.ActiveMemberIds.Remove(args.Event.Joiner.InternalId));

if (args.Event.Element.Attributes.ContainsKey("neo.origin") && args.Event.Element.Attributes["neo.origin"].ToString() == Namespace && args.Event.Element.Id.StartsWith("~conversation+")) {
args.Cancel = true;

var conversation = conversations.Find(_ => _.Channel.InternalId.Equals(args.Event.Element.InternalId));
Expand All @@ -35,6 +38,7 @@ public class ConversationPlugin : Plugin
}

if (conversation.Users.Contains(args.Event.Joiner.InternalId)) {
Logger.Instance.Log(LogLevel.Debug, "Conversation found, moving to " + conversation.Channel.Id);
args.Event.Joiner.MoveToChannel(conversation.Channel, true);
} else {
Logger.Instance.Log(LogLevel.Error, $"{args.Event.Joiner.Identity.Name} (@{args.Event.Joiner.Identity.Id}) is not part of this conversation.");
Expand All @@ -44,31 +48,57 @@ public class ConversationPlugin : Plugin

[EventListener(EventType.BeforeInput)]
public override async Task OnBeforeInput(Before<InputEventArgs> args) {
if (args.Event.Input.StartsWith("/pn ")) {
Logger.Instance.Log(LogLevel.Debug, "Input by " + args.Event.Sender.Identity.Id + " in " + args.Event.Sender.ActiveChannel.Id);

if (args.Event.Sender.ActiveChannel.Attributes.ContainsKey("neo.channeltype") && args.Event.Sender.ActiveChannel.Attributes["neo.channeltype"].ToString() == "conversation") {
args.Cancel = true;

var target = Pool.Server.Users.Find(_ => _.Identity.Id == args.Event.Input.Split(' ')[1])?.InternalId ?? Pool.Server.Accounts.Find(_ => _.Identity.Id == args.Event.Input.Split(' ')[1])?.InternalId;
var conversation = conversations.Find(_ => _.Channel.InternalId.Equals(args.Event.Sender.ActiveChannel.InternalId));
var received = MessagePackageContent.GetReceivedMessage(args.Event.Sender.InternalId, args.Event.Sender.Identity, args.Event.Input, conversation.Channel.InternalId);
var sent = MessagePackageContent.GetSentMessage(args.Event.Sender.InternalId, args.Event.Sender.Identity, args.Event.Input, conversation.Channel.InternalId);

conversation.Channel.SaveMessage(received);

args.Event.Sender.ToTarget().SendPackage(new Package(PackageType.Message, sent));
args.Event.Sender.ToTarget().SendPackage(new Package(PackageType.CustomEvent, new CustomEventArgs($"{Namespace}.update", InternalId, conversations.FindAll(_ => _.Users.Contains(args.Event.Sender.InternalId)))));

var targetUser = Pool.Server.Users.Find(_ => _.InternalId.Equals(conversation.Users.Find(u => !u.Equals(args.Event.Sender.InternalId))));
if (targetUser != null) {
targetUser.ToTarget().SendPackage(new Package(PackageType.Message, received));
targetUser.ToTarget().SendPackage(new Package(PackageType.CustomEvent, new CustomEventArgs($"{Namespace}.update", InternalId, conversations.FindAll(_ => _.Users.Contains(targetUser.InternalId)))));
}
}
}

[EventListener(EventType.Custom)]
public override async Task OnCustom(CustomEventArgs args) {
if (args.Name == $"{Namespace}.start") {
Logger.Instance.Log(LogLevel.Debug, "Start conversation with " + args.Content[0]);

var sender = Pool.Server.Users.Find(_ => _.InternalId.Equals(args.Sender));
var target = Pool.Server.Accounts.Find(_ => _.Identity.Id == args.Content[0].ToString())?.InternalId;

if (target == null) {
args.Event.Sender.ToTarget().SendPackage(new Package(PackageType.Message, new MessagePackageContent(pluginMember.InternalId, pluginMember.Identity, "Der Benutzer konnte nicht gefunden werden.", DateTime.Now, "received", args.Event.Sender.ActiveChannel.InternalId)));
//sender.ToTarget().SendPackage(new Package(PackageType.Message, new MessagePackageContent(pluginMember.InternalId, pluginMember.Identity, "Der Benutzer konnte nicht gefunden werden.", DateTime.Now, "received", sender.ActiveChannel.InternalId)));
} else {
var conversation = conversations.Find(_ => _.Users.Contains(args.Event.Sender.InternalId) && _.Users.Contains(target.Value));
var conversation = conversations.Find(_ => _.Users.Contains(sender.InternalId) && _.Users.Contains(target.Value));

if (conversation != null) {
args.Event.Sender.MoveToChannel(conversation.Channel, true);
Logger.Instance.Log(LogLevel.Debug, "Conversation found, moving to " + conversation.Channel.Id + " with " + conversation.Channel.ActiveMemberIds.Count + " active members");
sender.MoveToChannel(conversation.Channel, true);
return;
}

var channel = new Channel {
Attributes = new Dictionary<string, object> {
{ "neo.channeltype", "conversation" }
},
Id = $"~conversation+{args.Event.Sender.InternalId}+{target.Value}",
Id = $"~conversation+{sender.InternalId}+{target.Value}",
Lifetime = Lifespan.Permanent,
Limit = 2,
Name = $"Konversation zwischen {args.Event.Sender.InternalId} und {target.Value}",
Name = $"Konversation zwischen {sender.InternalId} und {target.Value}",
MemberIds = new List<Guid> {
args.Event.Sender.InternalId,
sender.InternalId,
target.Value
},
Password = ""
Expand All @@ -77,42 +107,17 @@ public class ConversationPlugin : Plugin
this.CreateChannel(pluginMember, channel);
Pool.Server.DataProvider.Save();

conversations.Add(new Conversation(args.Event.Sender.InternalId, target.Value, channel));
conversations.Add(new Conversation(sender.InternalId, target.Value, channel));
Save();

// TODO: Send notification to target
args.Event.Sender.ToTarget().SendPackage(new Package(PackageType.CustomEvent, new CustomEventArgs($"{Namespace}.update", InternalId, conversations.FindAll(_ => _.Users.Contains(args.Event.Sender.InternalId)))));

sender.ToTarget().SendPackage(new Package(PackageType.CustomEvent, new CustomEventArgs($"{Namespace}.update", InternalId, conversations.FindAll(_ => _.Users.Contains(sender.InternalId)))));

var targetUser = Pool.Server.Users.Find(_ => _.InternalId.Equals(target.Value));
targetUser?.ToTarget().SendPackage(new Package(PackageType.CustomEvent, new CustomEventArgs($"{Namespace}.update", InternalId, conversations.FindAll(_ => _.Users.Contains(targetUser.InternalId)))));

args.Event.Sender.MoveToChannel(channel);
sender.MoveToChannel(channel, true);
}
}

if (args.Event.Sender.ActiveChannel.Attributes.ContainsKey("neo.channeltype") && args.Event.Sender.ActiveChannel.Attributes["neo.channeltype"].ToString() == "conversation") {
var conversation = conversations.Find(_ => _.Channel.InternalId.Equals(args.Event.Sender.ActiveChannel.InternalId));

// Try manually saving the message
conversation.Channel.SaveMessage(MessagePackageContent.GetReceivedMessage(args.Event.Sender.InternalId, args.Event.Sender.Identity, args.Event.Input, conversation.Channel.InternalId));

args.Event.Sender.ToTarget().SendPackage(new Package(PackageType.CustomEvent, new CustomEventArgs($"{Namespace}.update", InternalId, conversations.FindAll(_ => _.Users.Contains(args.Event.Sender.InternalId)))));

var targetUser = Pool.Server.Users.Find(_ => _.InternalId.Equals(conversation.Users.Find(u => !u.Equals(args.Event.Sender.InternalId))));
if (targetUser != null) {
if (!targetUser.ActiveChannel.InternalId.Equals(conversation.Channel.InternalId)) {
targetUser.ToTarget().SendPackage(new Package(PackageType.Message, MessagePackageContent.GetReceivedMessage(args.Event.Sender.InternalId, args.Event.Sender.Identity, args.Event.Input, conversation.Channel.InternalId)));
}
targetUser.ToTarget().SendPackage(new Package(PackageType.CustomEvent, new CustomEventArgs($"{Namespace}.update", InternalId, conversations.FindAll(_ => _.Users.Contains(targetUser.InternalId)))));
}
}
}

[EventListener(EventType.Custom)]
public override async Task OnCustom(CustomEventArgs args) {
if (args.Name == $"{Namespace}.start") {
Logger.Instance.Log(LogLevel.Debug, "Start event from: " + args.Sender + " (Content: " + args.Content[0] + ")");
}
}

public override async Task OnDispose() {
Expand Down

0 comments on commit 7185587

Please sign in to comment.