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 }