add chatserver & client
This commit is contained in:
224
Project/fMain.cs
224
Project/fMain.cs
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user