add chatserver & client

This commit is contained in:
backuppc
2025-11-12 13:57:13 +09:00
parent e19b404580
commit d977c9da83
26 changed files with 2662 additions and 118 deletions

View File

@@ -20,11 +20,20 @@ namespace Project
string SearchKey = string.Empty;
private IDisposable webApp;
bool webok = false;
private ChatClientService chatService;
private System.Windows.Forms.Timer chatBlinkTimer;
private bool chatHasNewMessage = false;
private Dictionary<string, string> chatMessageSenders = new Dictionary<string, string>(); // employeeId -> nickName
public fMain()
{
InitializeComponent();
// Initialize chat blink timer
chatBlinkTimer = new System.Windows.Forms.Timer();
chatBlinkTimer.Interval = 500; // 500ms blink
chatBlinkTimer.Tick += ChatBlinkTimer_Tick;
this.KeyDown += (s1, e1) =>
{
if (e1.KeyCode == Keys.F12) btSetting.PerformClick();
@@ -93,6 +102,10 @@ namespace Project
}
}
// Stop chat service
chatService?.Stop();
chatBlinkTimer?.Stop();
FCOMMON.Pub.log.Add("Program Close");
FCOMMON.Pub.log.Flush();
}
@@ -193,6 +206,9 @@ namespace Project
Func_Login();
// Start chat service after login
StartChatService();
///즐겨찾기 목록 갱신
Update_FavoriteSite();
@@ -1558,8 +1574,214 @@ namespace Project
fdashboard.RefreshView();
Console.WriteLine( "view update");
}
}
}
#region Chat Functions
/// <summary>
/// Start chat service after login
/// </summary>
private void StartChatService()
{
try
{
// Get user info
string nickName = FCOMMON.info.Login.nameK ?? "Unknown";
string employeeId = FCOMMON.info.Login.no ?? "Unknown";
string userGroup = FCOMMON.info.Login.gcode ?? "default";
// Initialize chat service
//var chatServerIP = "127.0.0.1";// : "10.131.11.45";
var chatServerIP = "10.131.11.45";
chatService = new ChatClientService(chatServerIP, 5000);
chatService.ConnectionStatusChanged += ChatService_ConnectionStatusChanged;
chatService.MessageReceived += ChatService_MessageReceived;
// Start background service
chatService.Start(nickName, employeeId, userGroup);
FCOMMON.Pub.log.AddI($"Chat service started: {nickName} ({employeeId}, {userGroup})");
}
catch (Exception ex)
{
FCOMMON.Pub.log.AddE($"Failed to start chat service: {ex.Message}");
}
}
/// <summary>
/// Chat connection status changed
/// </summary>
private void ChatService_ConnectionStatusChanged(object sender, bool isConnected)
{
if (InvokeRequired)
{
BeginInvoke(new Action(() => ChatService_ConnectionStatusChanged(sender, isConnected)));
return;
}
if (isConnected)
{
sbChat.ForeColor = Color.Green;
sbChat.Text = "Notice ●";
}
else
{
sbChat.ForeColor = Color.Gray;
sbChat.Text = "Notice ○";
}
}
/// <summary>
/// Chat message received
/// </summary>
private void ChatService_MessageReceived(object sender, ChatMessage message)
{
if (InvokeRequired)
{
BeginInvoke(new Action(() => ChatService_MessageReceived(sender, message)));
return;
}
// Track message senders (only messages directed to me)
string myEmployeeId = chatService.EmployeeId;
if ((message.Type == MessageType.Chat || message.Type == MessageType.Whisper) &&
!string.IsNullOrEmpty(message.EmployeeId) &&
message.EmployeeId != myEmployeeId &&
message.TargetEmployeeId == myEmployeeId)
{
// Add or update sender
if (!chatMessageSenders.ContainsKey(message.EmployeeId))
{
chatMessageSenders[message.EmployeeId] = message.NickName ?? message.EmployeeId;
}
// Start blinking
chatHasNewMessage = true;
chatBlinkTimer.Start();
}
}
/// <summary>
/// Chat blink timer tick
/// </summary>
private void ChatBlinkTimer_Tick(object sender, EventArgs e)
{
if (!chatHasNewMessage)
{
chatBlinkTimer.Stop();
sbChat.ForeColor = chatService?.IsConnected == true ? Color.Green : Color.Gray;
return;
}
// Toggle color
sbChat.ForeColor = sbChat.ForeColor == Color.Red ? Color.Green : Color.Red;
}
/// <summary>
/// sbChat status label click event
/// </summary>
private void sbChat_Click(object sender, EventArgs e)
{
// Stop blinking
chatHasNewMessage = false;
chatBlinkTimer.Stop();
sbChat.ForeColor = chatService?.IsConnected == true ? Color.Green : Color.Gray;
// Show chat dialog
if (chatService == null)
{
MessageBox.Show("Chat service is not running.", "Chat", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
// If there are senders who sent messages, show selection dialog
if (chatMessageSenders.Count > 0)
{
// Create simple selection form
using (var selectForm = new Form())
{
selectForm.Text = "Select Sender";
selectForm.Size = new Size(400, 300);
selectForm.StartPosition = FormStartPosition.CenterParent;
selectForm.FormBorderStyle = FormBorderStyle.FixedDialog;
selectForm.MaximizeBox = false;
selectForm.MinimizeBox = false;
var listBox = new ListBox
{
Dock = DockStyle.Fill,
Font = new Font("Malgun Gothic", 10)
};
var buttonPanel = new Panel
{
Dock = DockStyle.Bottom,
Height = 50
};
var btnOk = new Button
{
Text = "Open Chat",
DialogResult = DialogResult.OK,
Size = new Size(100, 30),
Location = new Point(140, 10)
};
var btnNew = new Button
{
Text = "New Chat",
DialogResult = DialogResult.Retry,
Size = new Size(100, 30),
Location = new Point(250, 10)
};
buttonPanel.Controls.Add(btnOk);
buttonPanel.Controls.Add(btnNew);
selectForm.Controls.Add(listBox);
selectForm.Controls.Add(buttonPanel);
selectForm.AcceptButton = btnOk;
// Populate list with senders
foreach (var sender2 in chatMessageSenders)
{
listBox.Items.Add(new { EmployeeId = sender2.Key, NickName = sender2.Value, Display = $"{sender2.Value} ({sender2.Key})" });
}
listBox.DisplayMember = "Display";
if (listBox.Items.Count > 0)
listBox.SelectedIndex = 0;
var result = selectForm.ShowDialog(this);
if (result == DialogResult.OK && listBox.SelectedItem != null)
{
// Open chat with selected sender
dynamic selected = listBox.SelectedItem;
var chatForm = new Dialog.fChat(chatService, selected.EmployeeId, selected.NickName);
chatForm.Show();
// Remove from senders list (chat opened)
chatMessageSenders.Remove(selected.EmployeeId);
}
else if (result == DialogResult.Retry)
{
// Open new chat (user will select recipient in chat window)
var chatForm = new Dialog.fChat(chatService);
chatForm.Show();
}
}
}
else
{
// No senders, open new chat
var chatForm = new Dialog.fChat(chatService);
chatForm.Show();
}
}
#endregion
}
}