aboutsummaryrefslogtreecommitdiff
path: root/internal/server/event.go
diff options
context:
space:
mode:
author2025-12-31 14:15:42 +0300
committer2025-12-31 14:15:42 +0300
commit8c0b8ad931045c70845f662238230edb81f8cd94 (patch)
tree3bfa44e03bae220fc1233c02d716d0baa27efa3d /internal/server/event.go
parentнемного поправил отображение (diff)
downloadqchat-8c0b8ad931045c70845f662238230edb81f8cd94.tar.gz
qchat-8c0b8ad931045c70845f662238230edb81f8cd94.tar.bz2
qchat-8c0b8ad931045c70845f662238230edb81f8cd94.tar.xz
qchat-8c0b8ad931045c70845f662238230edb81f8cd94.zip
Сделал корректную работу с терминалом и историю
Diffstat (limited to '')
-rw-r--r--internal/server/event.go133
1 files changed, 133 insertions, 0 deletions
diff --git a/internal/server/event.go b/internal/server/event.go
new file mode 100644
index 0000000..d006d22
--- /dev/null
+++ b/internal/server/event.go
@@ -0,0 +1,133 @@
+package server
+
+import (
+ "fmt"
+ "io"
+ "regexp"
+ "strings"
+
+ "go.neonxp.ru/qchat/internal/chat"
+)
+
+var replacements = []replacement{
+ {
+ From: *regexp.MustCompile(`\*(.+?)\*`),
+ To: fmt.Sprintf("%s$1%s", escapeCodes[Bold], escapeCodes[Reset]),
+ },
+ {
+ From: *regexp.MustCompile(`\+(.+?)\+`),
+ To: fmt.Sprintf("%s$1%s", escapeCodes[Italic], escapeCodes[Reset]),
+ },
+ {
+ From: *regexp.MustCompile(`\-(.+?)\-`),
+ To: fmt.Sprintf("%s$1%s", escapeCodes[Strike], escapeCodes[Reset]),
+ },
+ {
+ From: *regexp.MustCompile(`_(.+?)_`),
+ To: fmt.Sprintf("%s$1%s", escapeCodes[Underline], escapeCodes[Reset]),
+ },
+}
+
+func processUserEvent(message any, w io.Writer, user *chat.User) {
+ switch message := message.(type) {
+ case chat.Message:
+ displayMessage(w, message, user)
+ case chat.SelfMessage:
+ displaySelfMessage(w, message)
+ case chat.SystemMessage:
+ displaySystemMessage(w, message)
+ case chat.UserJoined:
+ displayUserJoined(w, message)
+ case chat.UserLeft:
+ displayUserLeft(w, message)
+ case chat.UserLogs:
+ displayUserLogs(w, message)
+ }
+}
+
+func displayMessage(w io.Writer, message chat.Message, user *chat.User) {
+ msg := message.Message
+ mentionFrom := "@" + user.Username
+ mentionTo := string(escapeCodes[Yellow]) + string(escapeCodes[Underline]) + "@" + user.Username + string(escapeCodes[Reset])
+ if strings.Contains(msg, mentionFrom) {
+ msg = strings.ReplaceAll(msg, mentionFrom, mentionTo)
+ msg = "\x07\a" + msg
+ }
+
+ for _, r := range replacements {
+ msg = r.From.ReplaceAllString(msg, r.To)
+ }
+
+ fmt.Fprintf(w, "%s%18s%s [%s]%s: %s\n",
+ escapeCodes[Blue],
+ message.User.NUsername(),
+ escapeCodes[Green],
+ message.Time.Format("15:04:05"),
+ escapeCodes[Reset],
+ msg,
+ )
+}
+
+func displaySystemMessage(w io.Writer, message chat.SystemMessage) {
+ fmt.Fprintf(w, "%s* %s %s\n",
+ escapeCodes[Green],
+ message.Message,
+ escapeCodes[Reset],
+ )
+}
+func displaySelfMessage(w io.Writer, message chat.SelfMessage) {
+ fmt.Fprintf(w, "%s* %s %s%s\n",
+ escapeCodes[Blue],
+ message.User.NUsername(),
+ message.Message,
+ escapeCodes[Reset],
+ )
+}
+
+func displayUserJoined(w io.Writer, presence chat.UserJoined) {
+ fmt.Fprintf(w, "%s* %s joined to %s chan%s\n",
+ escapeCodes[Green],
+ presence.User.NUsername(),
+ presence.Chan.Name,
+ escapeCodes[Reset],
+ )
+}
+
+func displayUserLeft(w io.Writer, presence chat.UserLeft) {
+ fmt.Fprintf(w, "%s* %s left %s chan%s\n",
+ escapeCodes[Red],
+ presence.User.NUsername(),
+ presence.Chan.Name,
+ escapeCodes[Reset],
+ )
+}
+func displayUserLogs(w io.Writer, message chat.UserLogs) {
+ messages := make([]string, 0, len(message.Logs))
+ for _, m := range message.Logs {
+ switch m.Type {
+ case chat.TypeNone:
+ continue
+ case chat.TypeJoined:
+ messages = append(messages, fmt.Sprintf("* %18s [%s]: joined", m.Username, m.Time.Format("15:04:05")))
+ case chat.TypeLeft:
+ messages = append(messages, fmt.Sprintf("* %18s [%s]: left", m.Username, m.Time.Format("15:04:05")))
+ case chat.TypeMessage:
+ messages = append(messages, fmt.Sprintf("%18s [%s]: %s", m.Username, m.Time.Format("15:04:05"), m.Message))
+ }
+ }
+
+ if len(messages) == 0 {
+ return
+ }
+
+ fmt.Fprintf(w, "%s* Last channel messages:\n%s%s\n",
+ escapeCodes[Blue],
+ strings.Join(messages, "\n"),
+ escapeCodes[Reset],
+ )
+}
+
+type replacement struct {
+ From regexp.Regexp
+ To string
+}