diff options
| author | 2025-12-31 14:15:42 +0300 | |
|---|---|---|
| committer | 2025-12-31 14:15:42 +0300 | |
| commit | 8c0b8ad931045c70845f662238230edb81f8cd94 (patch) | |
| tree | 3bfa44e03bae220fc1233c02d716d0baa27efa3d /internal/server/event.go | |
| parent | немного поправил отображение (diff) | |
| download | qchat-8c0b8ad931045c70845f662238230edb81f8cd94.tar.gz qchat-8c0b8ad931045c70845f662238230edb81f8cd94.tar.bz2 qchat-8c0b8ad931045c70845f662238230edb81f8cd94.tar.xz qchat-8c0b8ad931045c70845f662238230edb81f8cd94.zip | |
Сделал корректную работу с терминалом и историю
Diffstat (limited to 'internal/server/event.go')
| -rw-r--r-- | internal/server/event.go | 133 |
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 +} |
