Pesquisar aqui

domingo, 1 de novembro de 2020

[IDS] Golang: GatheringTK's mixer tool

É díficil escolher ou fazer uma lista com as minhas linguagens de programação preferidas, pois costumo trabalhar com uma linguagem específica por algum tempo antes de "trocar" de "main programming language".
A linguagem que foi eleita é Golang, ainda que não seja a minha linguagem de foco atualmente. 
O que eu considero mais fascinante em Go são os erros/exceções! Não existem finally, try, except, catch, (...)! Quando uma função ou método pode reproduzir um erro, podemos criar um bloco condicional para verificar se o erro ocorreu ou não (o valor nil é um valor não inicializado) e depois decidir o que o programa deve fazer. No exemplo abaixo, a gestão de possíveis erros é fundamental, pois quando se está a trabalhar com ficheiros e directórios é preciso ter a certeza que não há erros na escolha do directório, na escolha do nome do ficheiro, na escrita no ficheiro, (...), são muitos factores que podem alterar o comportamento esperado do programa. A ferramenta "mixer" está escrita em Golang e faz parte da GatheringTK desenvolvida por mim, nos tempos livres! :)

package main

import (
  "bufio"
  "fmt"
  "os"
  "log"
  "strings"
)

const(
        blue="\033[36m"
        white="\033[97;1m"
        cyan="\033[96;1m"
        red = "\033[91;1m"
        green = "\033[92;1m"
        yellow = "\033[93;1m"
        clear = "\033[H\033[2J"
        menu = "\033[36m"
        reset = "\033[0m"
        option = "\033[33m"
)

func print(v string){
    fmt.Print(v);}

func help_menu(){
    fmt.Printf("\n %s \033[4m MIXER HELP\n%s", cyan, reset)
    fmt.Printf("%s*************************************************************************\n", menu)
    fmt.Printf("** %s'init' | 'file') %sCriar o ficheiro a ser utilizado. ('init filename')\n", option, menu)
    fmt.Printf("** %s'run'|'--r') %sExecutar o programa. ('run string1 string2 string3 ...')\n", option, menu)
    fmt.Printf("** %s'clear'|'-c'|'limpar') %sLimpar ecrã. ('clear')\n", option, menu)
    fmt.Printf("** %s'back'|'voltar'|'exit'|'-e'|'sair'|':q') %sVoltar atrás. ('back')\n", option, menu) 
    fmt.Printf("** %s'help'|'-h'|'--help'|'ajuda'|'?') %sExibir a ajuda. ('help')\n", option, menu)
    fmt.Printf("*************************************************************************\n")
}

func noContent(text string, command string) bool{
    lenCommand := len(command)
    textCommand := text[lenCommand:len(text)]
    if len(strings.TrimSpace(textCommand)) == 0 {
        fmt.Println(red+"[!] ",command,": falta de argumentos após o comando.")
        return true
    }
    return false   
}

func file_not_in_dir(dirname string, picked string) bool{
    var status bool
    status = true
    f, err := os.Open(dirname)
    if err != nil {
        log.Fatal(err)
    }
    files, err := f.Readdir(-1)
    f.Close()
    if err != nil {
        log.Fatal(err)
    }

    for _, file := range files {
        if picked == file.Name() {
            status = false
        }
    }
    return status
}	


func main() {
  reader := bufio.NewReader(os.Stdin)
  var P bool
  var f *os.File
  var ficheiro string
  for {
    print(white)
    print("gatheringtk("+blue+"mixer"+white+") >> ")
    text, _ := reader.ReadString('\n')
    text = strings.Replace(text, "\n", "", -1) 
    nomes := strings.Split(text," ")
    if (strings.Compare("", text) != 0) {
        switch nomes[0] {
        case "init","file":
            if noContent(text,"init") {
                break
            }
            ficheiro = nomes[1]+".txt"
            if file_not_in_dir("mixer/OUTPUT/",ficheiro){
                fi, err := os.Create("mixer/OUTPUT/"+ficheiro)
                f = fi
                if err != nil {
                    fmt.Println(err)
                    return
                    }
                defer f.Close()
                P = true
                wd, err := os.Getwd()
                if err != nil {
                    log.Println(err)
                }
                fmt.Println(green+"[+] Ficheiro "+ficheiro+" criado e gravado em "+wd+"/mixer/OUTPUT."+white)            
            } else {fmt.Println(yellow+"[*] Existe um ficheiro com o nome "+ficheiro+" em mixer/OUTPUT.\n"+red+"[!] Inicialização não realizada."+white)}
        case "help", "-h", "--help", "ajuda", "?":
            help_menu()
        case "back","voltar","exit", "-e", "sair", ":q":
            fmt.Println(yellow+"[*] O mixer será encerrado.")
            fmt.Println(green+"[+] Os desenvolvedores agradecem a sua utilização!")
            os.Exit(0)
        case "clear","-c","limpar":
            print(clear)
            break
        case "run", "--r":
            if P != true {
                fmt.Println(red+"[!] É preciso selecionar o nome do ficheiro.")
                break
            }
            if noContent(text,"run") {
                break
            }
            nomes = nomes[1:len(nomes)]
            for idxG,nomeGeral := range nomes{
                for idxInd,nome := range nomes{
                    if idxG != idxInd{        
                        n, err := f.WriteString(nomeGeral+nome+"\n"+strings.ToUpper(nomeGeral)+strings.ToUpper(nome)+"\n"+strings.ToLower(nomeGeral)+strings.ToLower(nome)+"\n"+strings.ToLower(nomeGeral)+"."+strings.ToLower(nome)+"\n"+strings.ToLower(nomeGeral)+"-"+strings.ToLower(nome)+"\n"+ strings.ToUpper(nomeGeral)+"."+strings.ToUpper(nome)+"\n"+strings.ToUpper(nomeGeral)+"-"+strings.ToUpper(nome)+"\n")
                        if err != nil {
                            fmt.Println(err)
                            log.Fatal(red+"[!!!] Impossível escrever no ficheiro.")
                            return
                        }
                        fmt.Println(yellow+"[*] ",n," bytes adicionados ao ficheiro."+white)
                   } 
                }
            }
            fmt.Println(green+"[+] Todos os 'usernames' possíveis adicionados ao ficheiro ",ficheiro,".")
        default:
            fmt.Println(red+"[!] Comando inexistente. Consulte os comandos com o comando help.")
        }

  }

 }

}

Sem comentários:

Enviar um comentário

Comente de forma construtiva...

Nota: só um membro deste blogue pode publicar um comentário.