2022-09-26 22:38:13 +02:00

434 lines
18 KiB
Go

package settings
import (
"context"
"encoding/json"
"errors"
"fmt"
"io/ioutil"
"net/http"
"github.com/FrankenBotDev/FrankenAPI/ent"
"github.com/FrankenBotDev/FrankenAPI/ent/settings"
"github.com/FrankenBotDev/FrankenAPI/ent/socialmedia"
"github.com/FrankenBotDev/FrankenAPI/pkg/routes/logger"
"github.com/FrankenBotDev/FrankenAPI/pkg/sys"
"github.com/go-chi/chi/v5"
)
func SettingsRouter() http.Handler {
r := chi.NewRouter()
r.Get("/", getServerSettings)
r.Post("/", createServerSettings)
r.Put("/", updateServerSettings)
r.Post("/socialmedia", createSocial)
r.Put("/socialmedia", updateSocial)
r.Delete("/socialmedia", deleteSocial)
r.Get("/socialmedia", getSocial)
return r
}
/* ==========================================================
ROUTE DEFINITIONS
=========================================================== */
func createServerSettings(w http.ResponseWriter, r *http.Request) {
// fetch data
settingsJson := make(map[string]any)
settingsData := sys.ProccessRequest(w, r.Body)
if settingsData == nil {
return
}
// process data
err := json.Unmarshal(settingsData, &settingsJson)
if err != nil {
sys.ErrorJsonResponse(w, "could_not_proccess_data", errors.New("request data could not be proccessed"))
}
if settingsJson["commiterid"] != "" {
if settingsJson["serverid"].(string) != "" {
if settingsJson["servername"].(string) != "" {
if settingsJson["ownerid"].(string) != "" {
// error handling and user communication
_, err = r.Context().Value(sys.EntClientKey).(*ent.Client).Settings.Create().SetWordfilter(false).
SetTwitterannounce(false).
SetTwitchannounce(false).
SetStatsprivate(true).
SetStatspagemode("default").
SetStatspage(false).
SetSpamprotection(false).
SetSpamchannel("general").
SetServername(settingsJson["servername"].(string)).
SetServerid(settingsJson["serverid"].(string)).
SetPermtoken("test").
SetOwnerid(settingsJson["ownerid"].(string)).
SetMusic(false).
SetModeration(false).
SetLoggerchannel("general").
SetLogger(false).
SetLinkprotection(false).
SetGreetings(false).
SetGreetermode("image").
SetGreeterchannel("general").
SetAutomatedmoderation(false).
SetApitoken("n/a").
SetApitoggle(false).
Save(r.Context().Value(sys.ContextClientKey).(context.Context))
if err != nil {
sys.ErrorJsonResponse(w, "data_could_not_be_added_to_database", errors.New("inserting settings into database failed"))
}
// Send message to the user if transaction could be made
// in this case only usefull for the bot but may be implemented to the webpage once stable implementation exists
logger.Logtodb([]string{"system", "settings for server" + settingsJson["serverid"].(string) + " was have been created", "settingscreate", settingsJson["serverid"].(string)}, r.Context().Value(sys.EntClientKey).(*ent.Client), r.Context().Value(sys.ContextClientKey).(context.Context))
w.Write([]byte(`{"type":"success", "code":"data_was_put_into_the_database"}`))
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("ownerid needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("servername needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("serverid needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "mssing_parameter", errors.New("commiterid needs to be set"))
}
}
func updateServerSettings(w http.ResponseWriter, r *http.Request) {
// fetch data
settingsJson := make(map[string]any)
settingsData, err := ioutil.ReadAll(r.Body)
if err != nil {
sys.ErrorJsonResponse(w, "could_not_find_data_in_request", errors.New("request body seems to be empty"))
}
// process data
err = json.Unmarshal(settingsData, &settingsJson)
if err != nil {
sys.ErrorJsonResponse(w, "could_not_proccess_data", errors.New("request data could not be proccessed"))
}
fmt.Println(settingsJson)
if commiteridStr, ok := settingsJson["commiterid"].(string); ok {
fmt.Println(0)
if serveridStr, ok := settingsJson["serverid"].(string); ok {
fmt.Println(1)
if blacklistBool, ok := settingsJson["blacklist"].(bool); ok {
fmt.Println(2)
if twitchannounceBool, ok := settingsJson["twitchannounce"].(bool); ok {
fmt.Println(3)
if twitterannounceBool, ok := settingsJson["twitteranounce"].(bool); ok {
fmt.Println(4)
if statsprivateBool, ok := settingsJson["statsprivate"].(bool); ok {
fmt.Println(5)
if statspagemodeStr, ok := settingsJson["statspagemode"].(string); ok {
fmt.Println(6)
if statspageBool, ok := settingsJson["statspage"].(bool); ok {
fmt.Println(7)
if spamprotectBool, ok := settingsJson["spamprotect"].(bool); ok {
fmt.Println(8)
if spamchannelStr, ok := settingsJson["spamchannel"].(string); ok {
fmt.Println(9)
if servernameStr, ok := settingsJson["servername"].(string); ok {
fmt.Println(10)
if musicBool, ok := settingsJson["music"].(bool); ok {
fmt.Println(11)
if moderationBool, ok := settingsJson["moderation"].(bool); ok {
fmt.Println(12)
if loggerchannelStr, ok := settingsJson["loggerchannel"].(string); ok {
fmt.Println(13)
if loggerBool, ok := settingsJson["logger"].(bool); ok {
fmt.Println(14)
if linkprotectBool, ok := settingsJson["linkprotect"].(bool); ok {
fmt.Println(15)
if helloBool, ok := settingsJson["greetings"].(bool); ok {
fmt.Println(16)
if greetingstypeStr, ok := settingsJson["greetingtype"].(string); ok {
fmt.Println(17)
if greetingschannelStr, ok := settingsJson["greetingchannel"].(string); ok {
fmt.Println(18)
if automodBool, ok := settingsJson["automod"].(bool); ok {
fmt.Println(19)
if apiBool, ok := settingsJson["apitoggle"].(bool); ok {
fmt.Println(20)
if statsBool, ok := settingsJson["stats"].(bool); ok {
fmt.Println(21)
if anounceChannelStr, ok := settingsJson["announcechannel"].(string); ok {
fmt.Println(21)
fmt.Println(spamprotectBool)
fmt.Println(linkprotectBool)
fmt.Println(blacklistBool)
fmt.Println(apiBool)
_, err := r.Context().Value(sys.EntClientKey).(*ent.Client).Settings.Update().
Where(settings.Serverid(serveridStr)).
SetWordfilter(blacklistBool).
SetTwitterannounce(twitterannounceBool).
SetTwitchannounce(twitchannounceBool).
SetStatsprivate(statsprivateBool).
SetStatspagemode(statspagemodeStr).
SetStatspage(statspageBool).
SetSpamprotection(spamprotectBool).
SetSpamchannel(spamchannelStr).
SetServername(servernameStr).
SetMusic(musicBool).
SetModeration(moderationBool).
SetLoggerchannel(loggerchannelStr).
SetLogger(loggerBool).
SetLinkprotection(linkprotectBool).
SetGreetings(helloBool).
SetGreetermode(greetingstypeStr).
SetGreeterchannel(greetingschannelStr).
SetAutomatedmoderation(automodBool).
SetApitoggle(apiBool).
SetStats(statsBool).
SetAnnouncechannel(anounceChannelStr).
Save(r.Context().Value(sys.ContextClientKey).(context.Context))
if err != nil {
fmt.Println(err)
http.Error(w, `{"type":"error", "code":"could_update_database"}`, http.StatusInternalServerError)
return
}
logger.Logtodb([]string{commiteridStr, "settings for server: " + serveridStr + " was changed by: " + commiteridStr, "settingschange", serveridStr}, r.Context().Value(sys.EntClientKey).(*ent.Client), r.Context().Value(sys.ContextClientKey).(context.Context))
w.Write([]byte(`{"type":"success", "code":"data_was_updated_in_the_database"}`))
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("announcechannel needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("stats needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("apitoggle needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("automod needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("greetingchannel needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("greetingtype needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("greetings needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("linkprotect needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("logger needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("loggerchannel needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("moderation needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("music needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("servername needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("spamchannel needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("spamprotect needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("statspage needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("statspagemode needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("statsprivate needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("twitchannounce needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("twitteranounce needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("blacklist needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("serverid needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("commiterid needs to be set"))
}
}
func getServerSettings(w http.ResponseWriter, r *http.Request) {
settingsQuery := r.URL.Query()
if settingsQuery.Get("commiterid") != "" {
if settingsQuery.Get("serverid") != "" {
// replace with actual api data
user, err := r.Context().Value(sys.EntClientKey).(*ent.Client).Settings.Query().Where(settings.Serverid(settingsQuery.Get("serverid"))).All(r.Context().Value(sys.ContextClientKey).(context.Context))
if err != nil {
sys.ErrorJsonResponse(w, "could_not_get_user", errors.New("the requested user was not found"))
}
sys.SuccessJsonResponse(w, user)
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("serverid needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("commiterid needs to be set"))
}
}
func createSocial(w http.ResponseWriter, r *http.Request) {
// fetch data
settingsJson := make(map[string]any)
settingsData, err := ioutil.ReadAll(r.Body)
if err != nil {
sys.ErrorJsonResponse(w, "could_not_find_data_in_request", errors.New("could not find data in that request"))
}
// process data
err = json.Unmarshal(settingsData, &settingsJson)
if err != nil {
sys.ErrorJsonResponse(w, "could_not_proccess_data", errors.New("request data could not be proccessed"))
}
if settingsJson["commiterid"].(string) != "" {
if settingsJson["serverid"].(string) != "" {
if settingsJson["identifier"].(string) != "" {
if settingsJson["type"].(string) != "" {
r.Context().Value(sys.EntClientKey).(*ent.Client).Socialmedia.Create().
SetServerid(settingsJson["serverid"].(string)).
SetIdentificator(settingsJson["identifier"].(string)).
SetType(settingsJson["type"].(string)).
Save(r.Context().Value(sys.ContextClientKey).(context.Context))
logger.Logtodb([]string{settingsJson["commiterid"].(string), "socialmedia entry for server" + settingsJson["serverid"].(string) + " was added by" + settingsJson["commiterid"].(string), "socialcreate", settingsJson["serverid"].(string)}, r.Context().Value(sys.EntClientKey).(*ent.Client), r.Context().Value(sys.ContextClientKey).(context.Context))
w.Write([]byte(`{"type":"success", "code":"data_was_put_into_the_database"}`))
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("type needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("identifier needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("serverid needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("commiterid needs to be set"))
}
}
/* ========================================================
todo: update all below todo comments asap
======================================================== */
// @TODO: actually updating the database
func updateSocial(w http.ResponseWriter, r *http.Request) {
// fetch data
settingsJson := make(map[string]any)
settingsData, err := ioutil.ReadAll(r.Body)
if err != nil {
sys.ErrorJsonResponse(w, "could_not_find_data_in_request", errors.New("could not find data in that request"))
}
// process data
err = json.Unmarshal(settingsData, &settingsJson)
if err != nil {
sys.ErrorJsonResponse(w, "could_not_proccess_data", errors.New("request data could not be proccessed"))
}
if settingsJson["commiterid"].(string) != "" {
if settingsJson["serverid"].(string) != "" {
if settingsJson["identifier"].(string) != "" {
if settingsJson["type"].(string) != "" {
_, err = r.Context().Value(sys.EntClientKey).(*ent.Client).Socialmedia.Update().
SetServerid(settingsJson["serverid"].(string)).
SetIdentificator(settingsJson["identifier"].(string)).
SetType(settingsJson["type"].(string)).
Save(r.Context().Value(sys.ContextClientKey).(context.Context))
if err != nil {
sys.ErrorJsonResponse(w, "database_error", errors.New("could not update the database"))
}
logger.Logtodb([]string{settingsJson["commiterid"].(string), "socialmedia entry for server" + settingsJson["serverid"].(string) + " was updated by" + settingsJson["commiterid"].(string), "socialupdate", settingsJson["serverid"].(string)}, r.Context().Value(sys.EntClientKey).(*ent.Client), r.Context().Value(sys.ContextClientKey).(context.Context))
w.Write([]byte(`{"type":"success", "code":"data_was_put_into_the_database"}`))
}
}
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("commiterid needs to be set"))
}
}
// @TODO fetch parameters from request query
func deleteSocial(w http.ResponseWriter, r *http.Request) {
if r.URL.Query().Get("commiterid") != "" {
if r.URL.Query().Get("serverid") != "" {
if r.URL.Query().Get("identifier") != "" {
_, err := r.Context().Value(sys.EntClientKey).(*ent.Client).Socialmedia.Delete().
Where(socialmedia.Serverid(r.URL.Query().Get("serverid")), socialmedia.Identificator(r.URL.Query().Get("identifier"))).
Exec(r.Context().Value(sys.ContextClientKey).(context.Context))
if err != nil {
sys.ErrorJsonResponse(w, "data_could_not_be_deleted", errors.New("the data requested could not be removed"))
}
w.Write([]byte(`{"type":"success", "code":"data_was_removed_successfully"}`))
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("identifier needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("serverid needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("commiterid needs to be set"))
}
}
// @TODO user userdata to manipulate the db query
func getSocial(w http.ResponseWriter, r *http.Request) {
userData := r.URL.Query()
fmt.Println(userData)
if userData.Get("commiterid") != "" {
if userData.Get("serverid") != "" {
if userData.Get("identifer") != "" {
// replace with actual api data
social, err := r.Context().Value(sys.EntClientKey).(*ent.Client).Socialmedia.Query().
Where(socialmedia.Serverid(userData.Get("serverid")), socialmedia.Identificator(userData.Get("identifer"))).All(r.Context().Value(sys.ContextClientKey).(context.Context))
if err != nil {
sys.ErrorJsonResponse(w, "could_not_get_user", errors.New("could not get the requested user object"))
}
sys.SuccessJsonResponse(w, social)
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("identifier needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("serverid needs to be set"))
}
} else {
sys.ErrorJsonResponse(w, "missing_parameter", errors.New("commiterid needs to be set"))
}
}