mastoGem/util.go

140 lines
3.7 KiB
Go

/*
MastoGem, A Mastodon proxy for Gemini
Copyright (C) 2021 Romain de Laage
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package main
import (
"html"
"regexp"
"strings"
"os"
"io/ioutil"
"encoding/json"
"log"
"time"
)
func getConfig() Config {
configPath := os.Getenv("MASTOGEM_CONFIG_PATH")
if configPath == "" {
log.Println("MASTOGEM_CONFIG_PATH was not set, using default settings")
config := Config{
Listen: "127.0.0.1:1965",
CertPath: "certs/cert.pem",
KeyPath: "certs/key.rsa",
BaseURL: "https://mamot.fr",
Title: "MastoGem",
HomeMessage: "Welcome on MastoGem, this is a Mastodon proxy for Gemini. You can view the last 20 toots of a Mastodon account by providing its ID.",
RateLimit: 45,
}
return config
}
configFile, err := ioutil.ReadFile(configPath)
if err != nil {
log.Fatalln("config file: %s", err)
}
var config Config
err = json.Unmarshal(configFile, &config)
if err != nil {
log.Fatalln("config file: %s", err)
}
return config
}
func removeHTMLTags(content string) string {
text := strings.ReplaceAll(content, "<p>", "")
text = strings.ReplaceAll(text, "</p>", "\n\n")
text = strings.ReplaceAll(text, "<br />", "\n")
text = strings.ReplaceAll(text, "<br>", "\n")
text = strings.ReplaceAll(text, "</a>", "")
text = strings.ReplaceAll(text, "</span>", "")
regexString := "<a( [^>]*)?>"
regex, err := regexp.Compile(regexString)
if err != nil {
log.Println("regex: %s", err)
return ""
}
text = regex.ReplaceAllLiteralString(text, "")
regexString = "<span( [^>]*)?>"
regex, err = regexp.Compile(regexString)
if err != nil {
log.Println("regex: %s", err)
return ""
}
text = regex.ReplaceAllLiteralString(text, "")
text = html.UnescapeString(text)
return text
}
func formatBlog(toot Blog) string {
content := toot.Content
content = removeHTMLTags(content)
content = strings.Trim(content, " \n\r")
content = strings.ReplaceAll(content, "\n#", "\n[#]")
if strings.HasPrefix(content, "#") {
content = "[#]" + content[1:]
}
var author string
if toot.Author.DisplayName == "" {
author = toot.Author.Name
} else {
author = toot.Author.DisplayName
}
if toot.Reblog == nil {
return "### Written by " + author + " on " + toot.Date[0:10] + " at " + toot.Date[11:16] + "\n" + content + "\n=> /toot/" + toot.Id + " More informations about this toot"
} else {
var originalAuthor string
if toot.Reblog.Author.DisplayName == "" {
originalAuthor = toot.Reblog.Author.Name
} else {
originalAuthor = toot.Reblog.Author.DisplayName
}
return "### Shared by " + author + " on " + toot.Date[0:10] + " at " + toot.Date[11:16] + " (original by " + originalAuthor + ")\n" + content + "\n=> /toot/" + toot.Id + " More informations about this toot"
}
}
func rateIsOk(tab map[string]Rate, remoteIP string, limit int) bool {
elmt, ok := tab[remoteIP]
if ok == false {
tab[remoteIP] = Rate{time.Now(), 1}
return true
} else {
if time.Since(elmt.Date).Minutes() >= 1 {
tab[remoteIP] = Rate{time.Now(), 1}
return true
} else {
if elmt.Count < limit {
tab[remoteIP] = Rate{elmt.Date, elmt.Count + 1}
return true
} else {
return false
}
}
}
}