commit dad1d0e

Hubert Hirtz  ·  2020-08-01 10:42:24 +0000 UTC
parent 4266525
Split event handling into functions
1 files changed,  +120, -112
+120, -112
  1@@ -55,125 +55,133 @@ func main() {
  2 	for !app.ShouldExit() {
  3 		select {
  4 		case ev := <-s.Poll():
  5-			switch ev := ev.(type) {
  6-			case irc.RegisteredEvent:
  7-				app.AddLine("home", "Connected to the server", time.Now(), false)
  8-			case irc.SelfJoinEvent:
  9-				app.AddBuffer(ev.Channel)
 10-			case irc.UserJoinEvent:
 11-				line := fmt.Sprintf("\x033+\x0314%s", ev.Nick)
 12-				app.AddLine(ev.Channel, line, ev.Time, true)
 13-			case irc.SelfPartEvent:
 14-				app.RemoveBuffer(ev.Channel)
 15-			case irc.UserPartEvent:
 16-				line := fmt.Sprintf("\x034-\x0314%s", ev.Nick)
 17-				app.AddLine(ev.Channel, line, ev.Time, true)
 18+			handleIRCEvent(app, ev)
 19+		case ev := <-app.Events:
 20+			handleUIEvent(app, &s, ev)
 21+		}
 22+	}
 23+}
 24+
 25+func handleIRCEvent(app *ui.UI, ev irc.Event) {
 26+	switch ev := ev.(type) {
 27+	case irc.RegisteredEvent:
 28+		app.AddLine("home", "Connected to the server", time.Now(), false)
 29+	case irc.SelfJoinEvent:
 30+		app.AddBuffer(ev.Channel)
 31+	case irc.UserJoinEvent:
 32+		line := fmt.Sprintf("\x033+\x0314%s", ev.Nick)
 33+		app.AddLine(ev.Channel, line, ev.Time, true)
 34+	case irc.SelfPartEvent:
 35+		app.RemoveBuffer(ev.Channel)
 36+	case irc.UserPartEvent:
 37+		line := fmt.Sprintf("\x034-\x0314%s", ev.Nick)
 38+		app.AddLine(ev.Channel, line, ev.Time, true)
 39+	case irc.ChannelMessageEvent:
 40+		line := formatIRCMessage(ev.Nick, ev.Content)
 41+		app.AddLine(ev.Channel, line, ev.Time, false)
 42+		app.TypingStop(ev.Channel, ev.Nick)
 43+	case irc.ChannelTypingEvent:
 44+		if ev.State == 1 || ev.State == 2 {
 45+			app.TypingStart(ev.Channel, ev.Nick)
 46+		} else {
 47+			app.TypingStop(ev.Channel, ev.Nick)
 48+		}
 49+	case irc.HistoryEvent:
 50+		var lines []ui.Line
 51+		var lastT time.Time
 52+		isChannel := ev.Target[0] == '#'
 53+		for _, m := range ev.Messages {
 54+			switch m := m.(type) {
 55 			case irc.ChannelMessageEvent:
 56-				line := formatIRCMessage(ev.Nick, ev.Content)
 57-				app.AddLine(ev.Channel, line, ev.Time, false)
 58-				app.TypingStop(ev.Channel, ev.Nick)
 59-			case irc.ChannelTypingEvent:
 60-				if ev.State == 1 || ev.State == 2 {
 61-					app.TypingStart(ev.Channel, ev.Nick)
 62+				if isChannel {
 63+					line := formatIRCMessage(m.Nick, m.Content)
 64+					line = strings.TrimRight(line, "\t ")
 65+					if lastT.Truncate(time.Minute) != m.Time.Truncate(time.Minute) {
 66+						lastT = m.Time
 67+						hour := lastT.Hour()
 68+						minute := lastT.Minute()
 69+						line = fmt.Sprintf("\x02%02d:%02d\x00 %s", hour, minute, line)
 70+					}
 71+					lines = append(lines, ui.NewLine(m.Time, false, line))
 72 				} else {
 73-					app.TypingStop(ev.Channel, ev.Nick)
 74+					panic("TODO")
 75 				}
 76-			case irc.HistoryEvent:
 77-				var lines []ui.Line
 78-				var lastT time.Time
 79-				isChannel := ev.Target[0] == '#'
 80-				for _, m := range ev.Messages {
 81-					switch m := m.(type) {
 82-					case irc.ChannelMessageEvent:
 83-						if isChannel {
 84-							line := formatIRCMessage(m.Nick, m.Content)
 85-							line = strings.TrimRight(line, "\t ")
 86-							if lastT.Truncate(time.Minute) != m.Time.Truncate(time.Minute) {
 87-								lastT = m.Time
 88-								hour := lastT.Hour()
 89-								minute := lastT.Minute()
 90-								line = fmt.Sprintf("\x02%02d:%02d\x00 %s", hour, minute, line)
 91-							}
 92-							lines = append(lines, ui.NewLine(m.Time, false, line))
 93-						} else {
 94-							panic("TODO")
 95-						}
 96-					}
 97+			}
 98+		}
 99+		app.AddHistoryLines(ev.Target, lines)
100+	case error:
101+		log.Panicln(ev)
102+	}
103+}
104+
105+func handleUIEvent(app *ui.UI, s *irc.Session, ev tcell.Event) {
106+	switch ev := ev.(type) {
107+	case *tcell.EventResize:
108+		app.Resize()
109+	case *tcell.EventKey:
110+		switch ev.Key() {
111+		case tcell.KeyCtrlC:
112+			app.Exit()
113+		case tcell.KeyCtrlL:
114+			app.Resize()
115+		case tcell.KeyCtrlU:
116+			fallthrough
117+		case tcell.KeyPgUp:
118+			app.ScrollUp()
119+			if app.IsAtTop() {
120+				buffer := app.CurrentBuffer()
121+				t := app.CurrentBufferOldestTime()
122+				s.RequestHistory(buffer, t)
123+			}
124+		case tcell.KeyCtrlD:
125+			fallthrough
126+		case tcell.KeyPgDn:
127+			app.ScrollDown()
128+		case tcell.KeyCtrlN:
129+			if app.NextBuffer() && app.IsAtTop() {
130+				buffer := app.CurrentBuffer()
131+				t := app.CurrentBufferOldestTime()
132+				s.RequestHistory(buffer, t)
133+			}
134+		case tcell.KeyCtrlP:
135+			if app.PreviousBuffer() && app.IsAtTop() {
136+				buffer := app.CurrentBuffer()
137+				t := app.CurrentBufferOldestTime()
138+				s.RequestHistory(buffer, t)
139+			}
140+		case tcell.KeyRight:
141+			if ev.Modifiers() == tcell.ModAlt {
142+				if app.NextBuffer() && app.IsAtTop() {
143+					buffer := app.CurrentBuffer()
144+					t := app.CurrentBufferOldestTime()
145+					s.RequestHistory(buffer, t)
146 				}
147-				app.AddHistoryLines(ev.Target, lines)
148-			case error:
149-				log.Panicln(ev)
150+			} else {
151+				app.InputRight()
152 			}
153-		case ev := <-app.Events:
154-			switch ev := ev.(type) {
155-			case *tcell.EventResize:
156-				app.Resize()
157-			case *tcell.EventKey:
158-				switch ev.Key() {
159-				case tcell.KeyCtrlC:
160-					app.Exit()
161-				case tcell.KeyCtrlL:
162-					app.Resize()
163-				case tcell.KeyCtrlU:
164-					fallthrough
165-				case tcell.KeyPgUp:
166-					app.ScrollUp()
167-					if app.IsAtTop() {
168-						buffer := app.CurrentBuffer()
169-						t := app.CurrentBufferOldestTime()
170-						s.RequestHistory(buffer, t)
171-					}
172-				case tcell.KeyCtrlD:
173-					fallthrough
174-				case tcell.KeyPgDn:
175-					app.ScrollDown()
176-				case tcell.KeyCtrlN:
177-					if app.NextBuffer() && app.IsAtTop() {
178-						buffer := app.CurrentBuffer()
179-						t := app.CurrentBufferOldestTime()
180-						s.RequestHistory(buffer, t)
181-					}
182-				case tcell.KeyCtrlP:
183-					if app.PreviousBuffer() && app.IsAtTop() {
184-						buffer := app.CurrentBuffer()
185-						t := app.CurrentBufferOldestTime()
186-						s.RequestHistory(buffer, t)
187-					}
188-				case tcell.KeyRight:
189-					if ev.Modifiers() == tcell.ModAlt {
190-						if app.NextBuffer() && app.IsAtTop() {
191-							buffer := app.CurrentBuffer()
192-							t := app.CurrentBufferOldestTime()
193-							s.RequestHistory(buffer, t)
194-						}
195-					} else {
196-						app.InputRight()
197-					}
198-				case tcell.KeyLeft:
199-					if ev.Modifiers() == tcell.ModAlt {
200-						if app.PreviousBuffer() && app.IsAtTop() {
201-							buffer := app.CurrentBuffer()
202-							t := app.CurrentBufferOldestTime()
203-							s.RequestHistory(buffer, t)
204-						}
205-					} else {
206-						app.InputLeft()
207-					}
208-				case tcell.KeyBackspace2:
209-					ok := app.InputBackspace()
210-					if ok && app.InputLen() == 0 {
211-						s.TypingStop(app.CurrentBuffer())
212-					}
213-				case tcell.KeyEnter:
214+		case tcell.KeyLeft:
215+			if ev.Modifiers() == tcell.ModAlt {
216+				if app.PreviousBuffer() && app.IsAtTop() {
217 					buffer := app.CurrentBuffer()
218-					input := app.InputEnter()
219-					handleInput(&s, buffer, input)
220-				case tcell.KeyRune:
221-					app.InputRune(ev.Rune())
222-					if app.CurrentBuffer() != "home" && !strings.HasPrefix(app.Input(), "/") {
223-						s.Typing(app.CurrentBuffer())
224-					}
225+					t := app.CurrentBufferOldestTime()
226+					s.RequestHistory(buffer, t)
227 				}
228+			} else {
229+				app.InputLeft()
230+			}
231+		case tcell.KeyBackspace2:
232+			ok := app.InputBackspace()
233+			if ok && app.InputLen() == 0 {
234+				s.TypingStop(app.CurrentBuffer())
235+			}
236+		case tcell.KeyEnter:
237+			buffer := app.CurrentBuffer()
238+			input := app.InputEnter()
239+			handleInput(s, buffer, input)
240+		case tcell.KeyRune:
241+			app.InputRune(ev.Rune())
242+			if app.CurrentBuffer() != "home" && !strings.HasPrefix(app.Input(), "/") {
243+				s.Typing(app.CurrentBuffer())
244 			}
245 		}
246 	}