refactor: cleanup initial impl and modularize everything

This commit is contained in:
2021-11-13 06:38:12 +02:00
parent 867e874ed3
commit 4bdb4a0fb3
10 changed files with 440 additions and 331 deletions
+76
View File
@@ -0,0 +1,76 @@
// gorc project
// Copyright (C) 2021 IllusionMan1212 and contributors
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, see https://www.gnu.org/licenses.
package client
import (
"crypto/tls"
"fmt"
"log"
)
type Client struct {
// tcp connection
conn *tls.Conn
// channel to receive data that comes through from the connection
receive chan string
}
func NewClient(host string, port string) *Client {
// TODO: allow for insecure connections thru a checkbox (needed for irc servers that maybe don't have encryption on)
// TODO: distinguish between secure and insecure connections
cfg := &tls.Config{ServerName: host}
addr := fmt.Sprintf("%s:%s", host, port)
conn, err := tls.Dial("tcp", addr, cfg)
if err != nil {
// TODO: properly handle the error instead of Fatal-ing (failed to initiate a connection to server)
log.Fatal(err)
}
// TODO: read nickname and channel from user input (stdin ?? or TUI)
conn.Write([]byte("CAP LS\r\n"))
// conn.Write([]byte("PASS password"))
conn.Write([]byte("NICK illusion434\r\n"))
conn.Write([]byte("USER illusion434 0 * :illusion434\r\n"))
// TODO: CAP REQ :whatever capability the client recognizes and supports
conn.Write([]byte("CAP END\r\n"))
conn.Write([]byte("JOIN ##programming\r\n"))
return &Client{
conn: conn,
receive: make(chan string),
}
}
func (c Client) handleCommand(message IRCMessage) {
switch message.Command {
case "PING":
c.conn.Write([]byte("PONG\r\n"))
break
}
// TODO: handle all other commands
}
func (c Client) Run() {
for {
select {
case line := <-c.receive:
messages := parseIRCMessage(line)
c.handleCommand(messages)
}
}
}
+67
View File
@@ -0,0 +1,67 @@
// gorc project
// Copyright (C) 2021 IllusionMan1212 and contributors
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, see https://www.gnu.org/licenses.
package client
import (
"strings"
)
func parseTags(rawTags string) []Tag {
// TODO:
// TOOD: some tags don't have an "=" and they're basically considered "true"
return nil
}
func parseIRCMessage(line string) IRCMessage {
ircMessage := &IRCMessage{}
if line[0] == '@' {
substrs := strings.SplitN(line, " ", 2)
tags := parseTags(substrs[0][1:])
ircMessage.Tags = tags
line = substrs[1]
}
if line[0] == ':' {
substrs := strings.SplitN(line, " ", 2)
ircMessage.Source = substrs[0]
line = substrs[1]
}
substrs := strings.SplitN(line, " ", 2)
ircMessage.Command = substrs[0]
// if parameters exist
if len(substrs) > 1 {
params := strings.SplitN(substrs[1], " :", 2)
parameters := strings.Split(params[0], " ")
// TODO: parameters can be empty. this is denoted by a ":"
// if there's a trailing parameter
if len(params) > 1 {
parameters = append(parameters, params[1])
}
ircMessage.Parameters = parameters
}
return *ircMessage
}
+29
View File
@@ -0,0 +1,29 @@
// gorc project
// Copyright (C) 2021 IllusionMan1212 and contributors
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, see https://www.gnu.org/licenses.
package client
type IRCMessage struct {
Tags []Tag // starts with @ | Optional
Source string // starts with : | Optional
Command string // can either be a string or a numeric value | Required
Parameters []string // Optional (Dependant on command)
}
type Tag struct {
key string
value string
}