Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ba8afc76cc | ||
|
|
e53631a65b | ||
|
|
e8b422e390 | ||
|
|
760dbec077 |
@@ -1,4 +1,4 @@
|
||||
module astraltech.xyz/m/v2
|
||||
module astraltech.xyz/calendar/v2
|
||||
|
||||
go 1.26.1
|
||||
|
||||
|
||||
+38
-29
@@ -1,43 +1,52 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"net/http"
|
||||
|
||||
ics "github.com/arran4/golang-ical"
|
||||
"astraltech.xyz/calendar/v2/webserver"
|
||||
)
|
||||
|
||||
func LoginHandler(w http.ResponseWriter, r *http.Request) {
|
||||
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
||||
var test_html string = "Hello, world"
|
||||
w.Write([]byte(test_html))
|
||||
}
|
||||
|
||||
func main() {
|
||||
read_config()
|
||||
init_dav_client()
|
||||
calDavData := get_caldav_data(serverConfig.Username, serverConfig.Password)
|
||||
|
||||
fmt.Println()
|
||||
webserver.ServeLoginPage("/login")
|
||||
webserver.EnableLogoRoute()
|
||||
webserver.ServeWebserver()
|
||||
|
||||
fmt.Printf("Users display name: %s\n", calDavData.DisplayName)
|
||||
fmt.Printf("Calandar Count: %d\n", len(calDavData.Calandars))
|
||||
for i := range len(calDavData.Calandars) {
|
||||
calDavData.Calandars[i] = get_calandar_data(calDavData.Calandars[i], serverConfig.Username, serverConfig.Password)
|
||||
// calDavData := get_caldav_data(serverConfig.Username, serverConfig.Password)
|
||||
// fmt.Println()
|
||||
|
||||
fmt.Printf("Cal %d is named %s\n", i, calDavData.Calandars[i].DisplayName)
|
||||
fmt.Printf("\tLink to cal: %s\n", calDavData.Calandars[i].Link)
|
||||
fmt.Printf("\tEvent count: %d\n", len(calDavData.Calandars[i].Events))
|
||||
for j := range len(calDavData.Calandars[i].Events) {
|
||||
cal, err := ics.ParseCalendar(strings.NewReader(calDavData.Calandars[i].Events[j].CalData))
|
||||
if err != nil {
|
||||
fmt.Print(err.Error())
|
||||
}
|
||||
events := cal.Events()
|
||||
for k := range len(events) {
|
||||
name := events[k].GetProperty(ics.ComponentProperty(ics.PropertySummary)).Value
|
||||
start, _ := events[k].GetStartAt()
|
||||
end, _ := events[k].GetEndAt()
|
||||
time := end.Sub(start)
|
||||
fmt.Printf("\t\tEvent name: %s\n", name)
|
||||
fmt.Printf("\t\t\tEvent start date: %s\n", end.UTC().String())
|
||||
fmt.Printf("\t\t\tEvent length date: %s\n", time.String())
|
||||
// fmt.Printf("Users display name: %s\n", calDavData.DisplayName)
|
||||
// fmt.Printf("Calandar Count: %d\n", len(calDavData.Calandars))
|
||||
// for i := range len(calDavData.Calandars) {
|
||||
// calDavData.Calandars[i] = get_calandar_data(calDavData.Calandars[i], serverConfig.Username, serverConfig.Password)
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
// fmt.Printf("Cal %d is named %s\n", i, calDavData.Calandars[i].DisplayName)
|
||||
// fmt.Printf("\tLink to cal: %s\n", calDavData.Calandars[i].Link)
|
||||
// fmt.Printf("\tEvent count: %d\n", len(calDavData.Calandars[i].Events))
|
||||
// for j := range len(calDavData.Calandars[i].Events) {
|
||||
// cal, err := ics.ParseCalendar(strings.NewReader(calDavData.Calandars[i].Events[j].CalData))
|
||||
// if err != nil {
|
||||
// fmt.Print(err.Error())
|
||||
// }
|
||||
// events := cal.Events()
|
||||
// for k := range len(events) {
|
||||
// name := events[k].GetProperty(ics.ComponentProperty(ics.PropertySummary)).Value
|
||||
// start, _ := events[k].GetStartAt()
|
||||
// end, _ := events[k].GetEndAt()
|
||||
// time := end.Sub(start)
|
||||
// fmt.Printf("\t\tEvent name: %s\n", name)
|
||||
// fmt.Printf("\t\t\tEvent start date: %s\n", end.UTC().String())
|
||||
// fmt.Printf("\t\t\tEvent length date: %s\n", time.String())
|
||||
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 65 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 202 KiB |
@@ -0,0 +1,4 @@
|
||||
this is meant to be a reusable webserver component that I can integrate into applications
|
||||
while it can serve custom routes it is also designed to server routes that are needed in all of my applications
|
||||
Examples:
|
||||
- Login page
|
||||
@@ -0,0 +1,27 @@
|
||||
package webserver
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"strings"
|
||||
"text/template"
|
||||
)
|
||||
|
||||
type LoginPageData struct {
|
||||
IsHiddenClassList string
|
||||
}
|
||||
|
||||
func loginHandler(w http.ResponseWriter, r *http.Request) {
|
||||
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
||||
tmpl := template.Must(template.ParseFiles("webserver/pages/login_page.html"))
|
||||
if r.Method == http.MethodGet {
|
||||
tmpl.Execute(w, LoginPageData{IsHiddenClassList: "hidden"})
|
||||
return
|
||||
}
|
||||
|
||||
if r.Method == http.MethodPost {
|
||||
username := r.FormValue("username")
|
||||
if strings.Contains(username, "/") {
|
||||
tmpl.Execute(w, LoginPageData{IsHiddenClassList: ""})
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
<!doctype html>
|
||||
<title>Astral Tech - Login</title>
|
||||
|
||||
<link
|
||||
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap"
|
||||
rel="stylesheet"
|
||||
/>
|
||||
<link rel="stylesheet" href="static/style.css" />
|
||||
<link rel="stylesheet" href="static/error/error.css" />
|
||||
<link rel="stylesheet" href="static/card.css" />
|
||||
<link rel="stylesheet" href="static/login_page.css" />
|
||||
|
||||
<img id="logo_image" alt="logo" src="/logo" />
|
||||
<form id="login_card" class="card" method="POST">
|
||||
<div id="welcome_text">
|
||||
Welcome to Astral Tech, Please Sign in to your account below
|
||||
</div>
|
||||
|
||||
<div class="error {{.IsHiddenClassList}}">
|
||||
⚠️ Invalid username or password.
|
||||
<button class="close_error_button">X</button>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="input_label">Username</label><br />
|
||||
<input type="text" name="username" placeholder="" required />
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="input_label">Password</label><br />
|
||||
<div class="password_box">
|
||||
<input type="password" name="password" placeholder="" required />
|
||||
<button type="button" class="show_password_toggle closed"></button>
|
||||
</div>
|
||||
</div>
|
||||
<button type="submit">Login</button>
|
||||
</form>
|
||||
|
||||
<script src="/static/error/error.js" type="text/javascript"></script>
|
||||
<script
|
||||
src="/static/javascript/show_password.js"
|
||||
type="text/javascript"
|
||||
></script>
|
||||
@@ -0,0 +1,34 @@
|
||||
package webserver
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
var routes []string
|
||||
|
||||
func ServeLoginPage(route string) {
|
||||
ServeWebpage(route, loginHandler)
|
||||
}
|
||||
|
||||
func EnableLogoRoute() {
|
||||
ServeWebpage("/logo", func(w http.ResponseWriter, r *http.Request) {
|
||||
http.ServeFile(w, r, "webserver/images/astraltech_logo.png")
|
||||
})
|
||||
|
||||
ServeWebpage("/favicon.ico", func(w http.ResponseWriter, r *http.Request) {
|
||||
http.ServeFile(w, r, "webserver/images/astraltech_favicon.png")
|
||||
})
|
||||
}
|
||||
|
||||
func ServeWebpage(url string, handler func(http.ResponseWriter, *http.Request)) {
|
||||
http.HandleFunc(url, handler)
|
||||
routes = append(routes, url)
|
||||
}
|
||||
|
||||
func ServeWebserver() {
|
||||
err := http.ListenAndServe(":8080", nil)
|
||||
if err != nil {
|
||||
fmt.Print(err.Error())
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user