Compare commits

..

4 Commits

Author SHA1 Message Date
raul adf22b588f Finish chat functionality and prepare for release
Go audit / audit (push) Successful in 1m8s Details
2024-04-01 12:28:22 +02:00
raul 9f87eefd68 Update README.md 2024-04-01 12:26:19 +02:00
raul 5b12496455 Add go-audit workflow and goreleaser config 2024-04-01 12:23:29 +02:00
raul 6da487bc86 Create testing branch and start channels 2024-03-29 14:57:02 +01:00
7 changed files with 161 additions and 34 deletions

View File

@ -0,0 +1,27 @@
name: Go audit
run-name: ${{ gitea.actor }} pushed to main! 🚀
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Go
uses: actions/setup-go@v2
with:
go-version: '>=1.22.0'
- name: Verify dependencies
run: go mod verify
- name: Build
run: go build -v ./...
- name: Run go vet
run: go vet ./...

1
.gitignore vendored
View File

@ -8,6 +8,7 @@
*.dll
*.so
*.dylib
dist/
# Test binary, built with `go test -c`
*.test

51
.goreleaser.yaml Normal file
View File

@ -0,0 +1,51 @@
# This is an example .goreleaser.yml file with some sensible defaults.
# Make sure to check the documentation at https://goreleaser.com
# The lines below are called `modelines`. See `:help modeline`
# Feel free to remove those if you don't want/need to use them.
# yaml-language-server: $schema=https://goreleaser.com/static/schema.json
# vim: set ts=2 sw=2 tw=0 fo=cnqoj
version: 1
before:
hooks:
# You may remove this if you don't use go modules.
- go mod tidy
# you may remove this if you don't need go generate
- go generate ./...
gitea_urls:
api: https://git.bulgariu.xyz/api/v1
download: https://git.bulgariu.xyz
builds:
- env:
- CGO_ENABLED=0
goos:
- linux
- windows
goarch:
- amd64
archives:
- format: tar.gz
# this name template makes the OS and Arch compatible with the results of `uname`.
name_template: >-
{{ .ProjectName }}_
{{- title .Os }}_
{{- if eq .Arch "amd64" }}x86_64
{{- else if eq .Arch "386" }}i386
{{- else }}{{ .Arch }}{{ end }}
{{- if .Arm }}v{{ .Arm }}{{ end }}
# use zip for windows archives
format_overrides:
- goos: windows
format: zip
changelog:
sort: asc
filters:
exclude:
- "^docs:"
- "^test:"

View File

@ -1,3 +1,11 @@
# mini-chat
Tiny IRC-like chat server I'm building in Go
Tiny IRC-like chat server built for compatibility with netcat and written in Go
# # Usage
# # # Starting the server
./mini-chat server --port 1337
# # # Connecting to the server
nc $SERVER_IP $SERVER_PORT

View File

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

View File

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

View File

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