Begin split into multiple files
This commit is contained in:
parent
66f6156ceb
commit
8f74708a44
|
@ -0,0 +1,40 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "log"
|
||||||
|
|
||||||
|
type Blog struct {
|
||||||
|
Id string `json:"id"`
|
||||||
|
Content string `json:"content"`
|
||||||
|
Date string `json:"created_at"`
|
||||||
|
Author Account `json:"account"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
Listen string `json:"listen"`
|
||||||
|
CertPath string `json:"cert_path"`
|
||||||
|
KeyPath string `json:"key_path"`
|
||||||
|
BaseURL string `json:"base_url"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
HomeMessage string `json:"home_message"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Account struct {
|
||||||
|
Id string `json:"id"`
|
||||||
|
Name string `json:"display_name"`
|
||||||
|
Url string `json:"url"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Thread struct {
|
||||||
|
Ancestors []Blog `json:"ancestors"`
|
||||||
|
Descendants []Blog `json:"descendants"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
config := getConfig()
|
||||||
|
|
||||||
|
listener := listen(config.Listen, config.CertPath, config.KeyPath)
|
||||||
|
log.Println("Server successfully started")
|
||||||
|
log.Println("Server is listening at " + config.Listen)
|
||||||
|
|
||||||
|
serve(listener, config.BaseURL, config.Title, config.HomeMessage)
|
||||||
|
}
|
|
@ -0,0 +1,132 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"log"
|
||||||
|
"encoding/json"
|
||||||
|
"io/ioutil"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
func getBlog(baseURL, account string) []Blog {
|
||||||
|
if baseURL == "" || account == "" {
|
||||||
|
log.Println("baseURL or account is empty")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := http.Get(baseURL + "/api/v1/accounts/" + account + "/statuses?exclude_reblogs=true&exlude_replies=true")
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Mastodon API request: %s", err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
if resp.StatusCode != 200 {
|
||||||
|
log.Println("Mastodon API response: %s", resp.Status)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
body, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Mastodon response body: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var blogs []Blog
|
||||||
|
json.Unmarshal(body, &blogs)
|
||||||
|
|
||||||
|
return blogs
|
||||||
|
}
|
||||||
|
|
||||||
|
func getAccount(baseURL, accountId string) (Account, error) {
|
||||||
|
if baseURL == "" || accountId == "" {
|
||||||
|
log.Println("baseURL or account is empty")
|
||||||
|
return Account{}, fmt.Errorf("baseURL or account is empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := http.Get(baseURL + "/api/v1/accounts/" + accountId)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Mastodon API request: %s", err)
|
||||||
|
return Account{}, fmt.Errorf("API request failed")
|
||||||
|
}
|
||||||
|
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
if resp.StatusCode != 200 {
|
||||||
|
log.Println("Mastodon API response: %s", resp.Status)
|
||||||
|
return Account{}, fmt.Errorf("API response is not 200")
|
||||||
|
}
|
||||||
|
|
||||||
|
body, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Mastodon response body: %s", err)
|
||||||
|
return Account{}, fmt.Errorf("Failed to read response")
|
||||||
|
}
|
||||||
|
|
||||||
|
var account Account
|
||||||
|
json.Unmarshal(body, &account)
|
||||||
|
|
||||||
|
return account, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getToot(baseURL, tootId string) (Blog, error) {
|
||||||
|
if baseURL == "" || tootId == "" {
|
||||||
|
log.Println("baseURL or tootID is empty")
|
||||||
|
return Blog{}, fmt.Errorf("baseURL or tootID is empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := http.Get(baseURL + "/api/v1/statuses/" + tootId)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Mastodon API request: %s", err)
|
||||||
|
return Blog{}, fmt.Errorf("API request failed")
|
||||||
|
}
|
||||||
|
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
if resp.StatusCode != 200 {
|
||||||
|
log.Println("Mastodon API response: %s", resp.Status)
|
||||||
|
return Blog{}, fmt.Errorf("API response is not 200")
|
||||||
|
}
|
||||||
|
|
||||||
|
body, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Mastodon response body: %s", err)
|
||||||
|
return Blog{}, fmt.Errorf("Failed to read response")
|
||||||
|
}
|
||||||
|
|
||||||
|
var toot Blog
|
||||||
|
json.Unmarshal(body, &toot)
|
||||||
|
|
||||||
|
return toot, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getThread(baseURL, tootId string) (Thread, error) {
|
||||||
|
if baseURL == "" || tootId == "" {
|
||||||
|
log.Println("baseURL or tootID is empty")
|
||||||
|
return Thread{}, fmt.Errorf("baseURL or tootID is empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := http.Get(baseURL + "/api/v1/statuses/" + tootId + "/context")
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Mastodon API request: %s", err)
|
||||||
|
return Thread{}, fmt.Errorf("API request failed")
|
||||||
|
}
|
||||||
|
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
if resp.StatusCode != 200 {
|
||||||
|
log.Println("Mastodon API response: %s", resp.Status)
|
||||||
|
return Thread{}, fmt.Errorf("API response is not 200")
|
||||||
|
}
|
||||||
|
|
||||||
|
body, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Mastodon response body: %s", err)
|
||||||
|
return Thread{}, fmt.Errorf("Failed to read response")
|
||||||
|
}
|
||||||
|
|
||||||
|
var thread Thread
|
||||||
|
json.Unmarshal(body, &thread)
|
||||||
|
|
||||||
|
return thread, nil
|
||||||
|
}
|
221
server.go
221
server.go
|
@ -5,84 +5,12 @@ import (
|
||||||
"net/url"
|
"net/url"
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
|
||||||
"bufio"
|
"bufio"
|
||||||
"os"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"fmt"
|
"fmt"
|
||||||
"encoding/json"
|
|
||||||
"io/ioutil"
|
|
||||||
"strings"
|
"strings"
|
||||||
"html"
|
|
||||||
"regexp"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Blog struct {
|
|
||||||
Id string `json:"id"`
|
|
||||||
Content string `json:"content"`
|
|
||||||
Date string `json:"created_at"`
|
|
||||||
Author Account `json:"account"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type Config struct {
|
|
||||||
Listen string `json:"listen"`
|
|
||||||
CertPath string `json:"cert_path"`
|
|
||||||
KeyPath string `json:"key_path"`
|
|
||||||
BaseURL string `json:"base_url"`
|
|
||||||
Title string `json:"title"`
|
|
||||||
HomeMessage string `json:"home_message"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type Account struct {
|
|
||||||
Id string `json:"id"`
|
|
||||||
Name string `json:"display_name"`
|
|
||||||
Url string `json:"url"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type Thread struct {
|
|
||||||
Ancestors []Blog `json:"ancestors"`
|
|
||||||
Descendants []Blog `json:"descendants"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
config := getConfig()
|
|
||||||
|
|
||||||
listener := listen(config.Listen, config.CertPath, config.KeyPath)
|
|
||||||
log.Println("Server successfully started")
|
|
||||||
log.Println("Server is listening at " + config.Listen)
|
|
||||||
|
|
||||||
serve(listener, config.BaseURL, config.Title, config.HomeMessage)
|
|
||||||
}
|
|
||||||
|
|
||||||
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: "cert.pem",
|
|
||||||
KeyPath: "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.",
|
|
||||||
}
|
|
||||||
|
|
||||||
return config
|
|
||||||
}
|
|
||||||
|
|
||||||
configFile, err := ioutil.ReadFile(configPath)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln("config file: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
var config Config
|
|
||||||
|
|
||||||
json.Unmarshal(configFile, &config)
|
|
||||||
|
|
||||||
return config
|
|
||||||
}
|
|
||||||
|
|
||||||
func listen(address, certFile, keyFile string) net.Listener {
|
func listen(address, certFile, keyFile string) net.Listener {
|
||||||
cert, err := tls.LoadX509KeyPair(certFile, keyFile)
|
cert, err := tls.LoadX509KeyPair(certFile, keyFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -307,152 +235,3 @@ func printThread(conn *tls.Conn, baseURL, tootID string) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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 getBlog(baseURL, account string) []Blog {
|
|
||||||
if baseURL == "" || account == "" {
|
|
||||||
log.Println("baseURL or account is empty")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
resp, err := http.Get(baseURL + "/api/v1/accounts/" + account + "/statuses?exclude_reblogs=true&exlude_replies=true")
|
|
||||||
if err != nil {
|
|
||||||
log.Println("Mastodon API request: %s", err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
defer resp.Body.Close()
|
|
||||||
|
|
||||||
if resp.StatusCode != 200 {
|
|
||||||
log.Println("Mastodon API response: %s", resp.Status)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
body, err := ioutil.ReadAll(resp.Body)
|
|
||||||
if err != nil {
|
|
||||||
log.Println("Mastodon response body: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
var blogs []Blog
|
|
||||||
json.Unmarshal(body, &blogs)
|
|
||||||
|
|
||||||
return blogs
|
|
||||||
}
|
|
||||||
|
|
||||||
func getAccount(baseURL, accountId string) (Account, error) {
|
|
||||||
if baseURL == "" || accountId == "" {
|
|
||||||
log.Println("baseURL or account is empty")
|
|
||||||
return Account{}, fmt.Errorf("baseURL or account is empty")
|
|
||||||
}
|
|
||||||
|
|
||||||
resp, err := http.Get(baseURL + "/api/v1/accounts/" + accountId)
|
|
||||||
if err != nil {
|
|
||||||
log.Println("Mastodon API request: %s", err)
|
|
||||||
return Account{}, fmt.Errorf("API request failed")
|
|
||||||
}
|
|
||||||
|
|
||||||
defer resp.Body.Close()
|
|
||||||
|
|
||||||
if resp.StatusCode != 200 {
|
|
||||||
log.Println("Mastodon API response: %s", resp.Status)
|
|
||||||
return Account{}, fmt.Errorf("API response is not 200")
|
|
||||||
}
|
|
||||||
|
|
||||||
body, err := ioutil.ReadAll(resp.Body)
|
|
||||||
if err != nil {
|
|
||||||
log.Println("Mastodon response body: %s", err)
|
|
||||||
return Account{}, fmt.Errorf("Failed to read response")
|
|
||||||
}
|
|
||||||
|
|
||||||
var account Account
|
|
||||||
json.Unmarshal(body, &account)
|
|
||||||
|
|
||||||
return account, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func getToot(baseURL, tootId string) (Blog, error) {
|
|
||||||
if baseURL == "" || tootId == "" {
|
|
||||||
log.Println("baseURL or tootID is empty")
|
|
||||||
return Blog{}, fmt.Errorf("baseURL or tootID is empty")
|
|
||||||
}
|
|
||||||
|
|
||||||
resp, err := http.Get(baseURL + "/api/v1/statuses/" + tootId)
|
|
||||||
if err != nil {
|
|
||||||
log.Println("Mastodon API request: %s", err)
|
|
||||||
return Blog{}, fmt.Errorf("API request failed")
|
|
||||||
}
|
|
||||||
|
|
||||||
defer resp.Body.Close()
|
|
||||||
|
|
||||||
if resp.StatusCode != 200 {
|
|
||||||
log.Println("Mastodon API response: %s", resp.Status)
|
|
||||||
return Blog{}, fmt.Errorf("API response is not 200")
|
|
||||||
}
|
|
||||||
|
|
||||||
body, err := ioutil.ReadAll(resp.Body)
|
|
||||||
if err != nil {
|
|
||||||
log.Println("Mastodon response body: %s", err)
|
|
||||||
return Blog{}, fmt.Errorf("Failed to read response")
|
|
||||||
}
|
|
||||||
|
|
||||||
var toot Blog
|
|
||||||
json.Unmarshal(body, &toot)
|
|
||||||
|
|
||||||
return toot, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func getThread(baseURL, tootId string) (Thread, error) {
|
|
||||||
if baseURL == "" || tootId == "" {
|
|
||||||
log.Println("baseURL or tootID is empty")
|
|
||||||
return Thread{}, fmt.Errorf("baseURL or tootID is empty")
|
|
||||||
}
|
|
||||||
|
|
||||||
resp, err := http.Get(baseURL + "/api/v1/statuses/" + tootId + "/context")
|
|
||||||
if err != nil {
|
|
||||||
log.Println("Mastodon API request: %s", err)
|
|
||||||
return Thread{}, fmt.Errorf("API request failed")
|
|
||||||
}
|
|
||||||
|
|
||||||
defer resp.Body.Close()
|
|
||||||
|
|
||||||
if resp.StatusCode != 200 {
|
|
||||||
log.Println("Mastodon API response: %s", resp.Status)
|
|
||||||
return Thread{}, fmt.Errorf("API response is not 200")
|
|
||||||
}
|
|
||||||
|
|
||||||
body, err := ioutil.ReadAll(resp.Body)
|
|
||||||
if err != nil {
|
|
||||||
log.Println("Mastodon response body: %s", err)
|
|
||||||
return Thread{}, fmt.Errorf("Failed to read response")
|
|
||||||
}
|
|
||||||
|
|
||||||
var thread Thread
|
|
||||||
json.Unmarshal(body, &thread)
|
|
||||||
|
|
||||||
return thread, nil
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"html"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
"os"
|
||||||
|
"io/ioutil"
|
||||||
|
"encoding/json"
|
||||||
|
"log"
|
||||||
|
)
|
||||||
|
|
||||||
|
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.",
|
||||||
|
}
|
||||||
|
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
configFile, err := ioutil.ReadFile(configPath)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln("config file: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var config Config
|
||||||
|
|
||||||
|
json.Unmarshal(configFile, &config)
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
Loading…
Reference in New Issue