Finish chat functionality and prepare for release
Go audit / audit (push) Successful in 1m8s Details

This commit is contained in:
raul 2024-04-01 12:28:22 +02:00
parent 9f87eefd68
commit adf22b588f
3 changed files with 62 additions and 36 deletions

View File

@ -1,7 +1,7 @@
/* /*
Copyright © 2024 Raul Copyright © 2024 Raul
*/ */
package cmd package cmd
import ( import (
@ -10,18 +10,16 @@ import (
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
// rootCmd represents the base command when called without any subcommands // rootCmd represents the base command when called without any subcommands
var rootCmd = &cobra.Command{ var rootCmd = &cobra.Command{
Use: "mini-chat", Use: "mini-chat",
Short: "A brief description of your application", Short: "Minimalistic chat server built using Go",
Long: `A longer description that spans multiple lines and likely contains Long: `mini-chat was originally designed to be used as a standalone server
examples and usage of using your application. For example: users could connect to using netcat, but it can be also used with the binary
client
Cobra is a CLI library for Go that empowers applications. Examples:
This application is a tool to generate the needed files ./mini-chat server --port 8080`,
to quickly create a Cobra application.`,
// Uncomment the following line if your bare application // Uncomment the following line if your bare application
// has an action associated with it: // has an action associated with it:
// Run: func(cmd *cobra.Command, args []string) { }, // Run: func(cmd *cobra.Command, args []string) { },
@ -47,5 +45,3 @@ func init() {
// when this action is called directly. // when this action is called directly.
rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
} }

View File

@ -1,31 +1,29 @@
/* /*
Copyright © 2024 Raul Copyright © 2024 Raul
*/ */
package cmd package cmd
import ( import (
"bufio" "bufio"
"fmt" "fmt"
//"log" "github.com/spf13/cobra"
"net" "net"
"strings" "strings"
"time" "time"
//"os"
"github.com/spf13/cobra"
) )
// serverCmd represents the server command // serverCmd represents the server command
var serverCmd = &cobra.Command{ var serverCmd = &cobra.Command{
Use: "server", Use: "server",
Short: "A brief description of your command", Short: "Main chat server",
Long: `A longer description that spans multiple lines and likely contains examples Long: `You can connect to this server by running the following command from
and usage of using your command. For example: a client:
nc $SERVER_IP $PORT
Cobra is a CLI library for Go that empowers applications. Assuming your IP is 192.168.0.30 and the server port is left on default the
This application is a tool to generate the needed files command would be as follows:
to quickly create a Cobra application.`, nc 192.168.0.30 1302`,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
server(cmd) server(cmd)
}, },
@ -46,6 +44,13 @@ func init() {
serverCmd.Flags().String("port", "1302", "Port to listen on") serverCmd.Flags().String("port", "1302", "Port to listen on")
} }
var receiverIsStarted bool = false
type chatter struct {
Username string
IP string
}
func server(cmd *cobra.Command) { func server(cmd *cobra.Command) {
var lport string var lport string
port, _ := cmd.Flags().GetString("port") port, _ := cmd.Flags().GetString("port")
@ -58,42 +63,66 @@ func server(cmd *cobra.Command) {
ln, err := net.Listen("tcp", ":"+lport) ln, err := net.Listen("tcp", ":"+lport)
cobra.CheckErr(err) cobra.CheckErr(err)
fmt.Printf("Listening on port %v...\n", lport) fmt.Printf("Listening on port %v...\n", lport)
messageChan := make(chan string) masterChannel := make(chan string, 20)
slaveChannel := make(chan string, 20)
go masterReceiver(slaveChannel, masterChannel)
// TODO: get channels properly working // TODO: get channels properly working
// receivingChannel := make(chan string) // receivingChannel := make(chan string)
//sendingChannelº := make(chan string) // sendingChannel := make(chan string)
for { for {
conn, err := ln.Accept() conn, err := ln.Accept()
cobra.CheckErr(err) cobra.CheckErr(err)
go handleConn(conn, messageChan) numOfClients++
go handleConn(conn, slaveChannel, masterChannel)
} }
} }
type chatter struct { var numOfClients int = 0
Username string
IP string func masterReceiver(slaveChannel chan<- string, masterChannel <-chan string) {
for {
message := <-masterChannel
for i := 0; i < numOfClients; i++ {
slaveChannel <- message
}
}
} }
func handleConn(conn net.Conn, ch chan string) { // func receiver(conn net.Conn, ch chan string) {
// fmt.Println("THE RECEIVER HAS BEEN STARTED, YOU CAN ONLY SEE THIS MESSAGE ONCE")
// receiverIsStarted = false
// for {
// select {
// case otherMessage := <-ch:
// conn.Write([]byte(otherMessage))
// default:
// }
// }
// }
func handleConn(conn net.Conn, slaveChannel <-chan string, masterChannel chan<- string) {
defer conn.Close() defer conn.Close()
var otherMessage string //var otherMessage string
go func() { go func() {
for { for {
otherMessage = <-ch //select {
conn.Write([]byte(otherMessage)) message := <-slaveChannel
conn.Write([]byte(message))
} }
}() }()
IP := getIP(conn) IP := getIP(conn)
t := time.Now() t := time.Now()
date := fmt.Sprintf("%d-%02d-%02dT%02d:%02d:%02d", t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second()) date := fmt.Sprintf("%d-%02d-%02d | %02d:%02d:%02d", t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second())
final_message_connect := fmt.Sprintf("[%v] Received connection from %v!\n", date, IP) final_message_connect := fmt.Sprintf("[%v] Received connection from %v!\n", date, IP)
fmt.Print(final_message_connect) fmt.Print(final_message_connect)
conn.Write([]byte("What's your name?\nName: ")) conn.Write([]byte("What's your name?\nName: "))
name, err := bufio.NewReader(conn).ReadString('\n') name, err := bufio.NewReader(conn).ReadString('\n')
if err != nil { if err != nil {
numOfClients--
return return
} }
var NewUser = new(chatter) var NewUser = new(chatter)
@ -103,11 +132,12 @@ func handleConn(conn net.Conn, ch chan string) {
message, err := bufio.NewReader(conn).ReadString('\n') message, err := bufio.NewReader(conn).ReadString('\n')
if err != nil { if err != nil {
fmt.Printf(NewUser.Username + " disconnected!\n") fmt.Printf(NewUser.Username + " disconnected!\n")
numOfClients--
return return
} }
finalMessage := fmt.Sprint("{" + NewUser.IP + "} " + NewUser.Username + ": " + message) finalMessage := fmt.Sprint("{" + NewUser.IP + "} " + NewUser.Username + ": " + message)
fmt.Print(finalMessage) fmt.Print(finalMessage)
ch <- finalMessage masterChannel <- finalMessage
//conn.Write([]byte(message)) //conn.Write([]byte(message))
} }
} }

View File

@ -1,7 +1,7 @@
/* /*
Copyright © 2024 Raul Copyright © 2024 Raul
*/ */
package main package main
import "mini-chat/cmd" import "mini-chat/cmd"