-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
112 lines (96 loc) · 3.56 KB
/
Program.cs
File metadata and controls
112 lines (96 loc) · 3.56 KB
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
using Selena.API;
namespace Selena.Examples.Chat
{
/// <summary>
/// Chat Application Example
/// Demonstrates a multi-process chat application using Selena.
/// Run multiple instances with different usernames to test communication.
/// Usage: dotnet run -- [username]
/// </summary>
class Program
{
static async Task Main(string[] args)
{
string userName = args.Length > 0 ? args[0] : "User";
Console.WriteLine("Selena - Chat Example");
Console.WriteLine("=========================\n");
Console.WriteLine($"Chat Example - User: {userName}");
Console.WriteLine("--------------------------------");
Console.WriteLine("Type messages to send. Type 'exit' to quit.\n");
const int ChatMessageType = 100;
object consoleLock = new();
SelenaConfig config = new()
{
ChannelName = "ChatChannel",
BufferSize = 1 * 1024 * 1024, // 1MB
OverflowStrategy = OverflowStrategy.Overwrite,
PollingInterval = 5,
ScopeMode = ScopeMode.Local,
CompressionThreshold = 1024,
MaxWaitTime = 5000,
UseReaderWriterLocks = false,
EnableOptimizations = false,
EnableCompression = false,
EnableJsonLogging = false
};
using SelenaChannel channel = new(config);
// Subscribe to messages
channel.MessageReceived += (sender, e) =>
{
if (e.Message.Header.MessageType != ChatMessageType)
{
return;
}
ChatMessage? chatMessage = e.GetMessageObject<ChatMessage>();
if (chatMessage == null)
{
return;
}
if (string.Equals(chatMessage.Sender, userName, StringComparison.OrdinalIgnoreCase))
{
// Local echo is handled immediately after sending
return;
}
lock (consoleLock)
{
Console.WriteLine();
Console.WriteLine($"[{chatMessage.Timestamp:HH:mm:ss}] {chatMessage.Sender}: {chatMessage.Text}");
Console.Write("> ");
}
};
// Start listening
channel.Start();
// Input loop
while (true)
{
Console.Write("> ");
string? input = Console.ReadLine();
if (string.IsNullOrEmpty(input) || input.ToLower() == "exit")
{
break;
}
ChatMessage chatMessage = new()
{
Sender = userName,
Text = input,
Timestamp = DateTime.Now
};
await channel.SendObjectAsync(chatMessage, messageType: ChatMessageType);
lock (consoleLock)
{
Console.WriteLine($"[{chatMessage.Timestamp:HH:mm:ss}] {chatMessage.Sender} (you): {chatMessage.Text}");
}
}
Console.WriteLine("Chat ended.");
}
}
/// <summary>
/// Chat message model for serialization
/// </summary>
public class ChatMessage
{
public string Sender { get; set; } = "";
public string Text { get; set; } = "";
public DateTime Timestamp { get; set; }
}
}