Add web server that is not useful
This commit is contained in:
		
							parent
							
								
									cf5f2e6598
								
							
						
					
					
						commit
						deb12318b6
					
				
					 6 changed files with 409 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -34,6 +34,9 @@ spec:
 | 
			
		|||
      - image: imartyn/karaokardbot:0.0.1
 | 
			
		||||
        imagePullPolicy: IfNotPresent
 | 
			
		||||
        name: kardbot
 | 
			
		||||
        ports:
 | 
			
		||||
        - name: web
 | 
			
		||||
          containerPort: 5353
 | 
			
		||||
        resources: {}
 | 
			
		||||
        terminationMessagePath: /dev/termination-log
 | 
			
		||||
        terminationMessagePolicy: File
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										96
									
								
								internal/webserver/webserver.go
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										96
									
								
								internal/webserver/webserver.go
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,96 @@
 | 
			
		|||
package webserver
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/gorilla/handlers"
 | 
			
		||||
	"github.com/gorilla/mux"
 | 
			
		||||
	"github.com/gorilla/sessions"
 | 
			
		||||
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"html/template"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"os"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//var store = sessions.NewCookieStore(os.Getenv("SESSION_KEY"))
 | 
			
		||||
 | 
			
		||||
var store = sessions.NewCookieStore([]byte("GO_SESS"))
 | 
			
		||||
 | 
			
		||||
func HealthHandler(response http.ResponseWriter, request *http.Request) {
 | 
			
		||||
	response.Header().Add("Content-type", "text/plain")
 | 
			
		||||
	fmt.Fprint(response, "I'm okay jack!")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NotFoundHandler(response http.ResponseWriter, request *http.Request) {
 | 
			
		||||
	response.Header().Add("X-Template-File", "html"+request.URL.Path)
 | 
			
		||||
	tmpl := template.Must(template.ParseFiles("web/404.html"))
 | 
			
		||||
	tmpl.Execute(response, nil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func CSSHandler(response http.ResponseWriter, request *http.Request) {
 | 
			
		||||
	response.Header().Add("Content-type", "text/css")
 | 
			
		||||
	tmpl := template.Must(template.ParseFiles("web/cover.css"))
 | 
			
		||||
	tmpl.Execute(response, nil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RootHandler(response http.ResponseWriter, request *http.Request) {
 | 
			
		||||
	request.URL.Path = "/index.html"
 | 
			
		||||
	TemplateHandler(response, request)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TemplateHandler(response http.ResponseWriter, request *http.Request) {
 | 
			
		||||
	response.Header().Add("X-Template-File", "web"+request.URL.Path)
 | 
			
		||||
	type TemplateData struct {
 | 
			
		||||
		Prompt     string
 | 
			
		||||
		AvailCount int
 | 
			
		||||
	}
 | 
			
		||||
	// tmpl, err := template.New("html"+request.URL.Path).Funcs(template.FuncMap{
 | 
			
		||||
	// 	"ToUpper": strings.ToUpper,
 | 
			
		||||
	// 	"ToLower": strings.ToLower,
 | 
			
		||||
	// }).ParseFiles("html"+request.URL.Path)
 | 
			
		||||
	_ = strings.ToLower("Hello")
 | 
			
		||||
	if strings.Index(request.URL.Path, "/") < 0 {
 | 
			
		||||
		http.Error(response, "No slashes wat - "+request.URL.Path, http.StatusInternalServerError)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	basenameSlice := strings.Split(request.URL.Path, "/")
 | 
			
		||||
	basename := basenameSlice[len(basenameSlice)-1]
 | 
			
		||||
	//fmt.Fprintf(response, "%q", basenameSlice)
 | 
			
		||||
	tmpl, err := template.New(basename).Funcs(template.FuncMap{
 | 
			
		||||
		"ToUpper": strings.ToUpper,
 | 
			
		||||
		"ToLower": strings.ToLower,
 | 
			
		||||
	}).ParseFiles("web" + request.URL.Path)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		http.Error(response, err.Error(), http.StatusInternalServerError)
 | 
			
		||||
		return
 | 
			
		||||
		// NotFoundHandler(response, request)
 | 
			
		||||
		// return
 | 
			
		||||
	}
 | 
			
		||||
	var td = TemplateData{"Hello", 1}
 | 
			
		||||
	err = tmpl.Execute(response, td)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		http.Error(response, err.Error(), http.StatusInternalServerError)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func HandleHTTP() {
 | 
			
		||||
	r := mux.NewRouter()
 | 
			
		||||
	loggedRouter := handlers.LoggingHandler(os.Stdout, r)
 | 
			
		||||
	r.NotFoundHandler = http.HandlerFunc(NotFoundHandler)
 | 
			
		||||
	r.HandleFunc("/", RootHandler)
 | 
			
		||||
	r.HandleFunc("/healthz", HealthHandler)
 | 
			
		||||
	r.HandleFunc("/example/{.*}", TemplateHandler)
 | 
			
		||||
	r.HandleFunc("/cover.css", CSSHandler)
 | 
			
		||||
	http.Handle("/", r)
 | 
			
		||||
	srv := &http.Server{
 | 
			
		||||
		Handler:      loggedRouter,
 | 
			
		||||
		Addr:         "0.0.0.0:5353",
 | 
			
		||||
		WriteTimeout: 15 * time.Second,
 | 
			
		||||
		ReadTimeout:  15 * time.Second,
 | 
			
		||||
	}
 | 
			
		||||
	fmt.Println("Listening on 0.0.0.0:5353")
 | 
			
		||||
	srv.ListenAndServe()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										7
									
								
								main.go
									
										
									
									
									
								
							
							
						
						
									
										7
									
								
								main.go
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -11,6 +11,7 @@ import (
 | 
			
		|||
 | 
			
		||||
	builtins "git.martyn.berlin/martyn/karaokards/internal/builtins"
 | 
			
		||||
	irc "git.martyn.berlin/martyn/karaokards/internal/irc"
 | 
			
		||||
	webserver "git.martyn.berlin/martyn/karaokards/internal/webserver"
 | 
			
		||||
	rgb "github.com/foresthoffman/rgblog"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -26,8 +27,8 @@ func readBonusStrings() []string {
 | 
			
		|||
 | 
			
		||||
	ex, err := os.Executable()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return []string{}
 | 
			
		||||
		fmt.Println("Could not read `strings.json`, will only have builtin prompts. File reading error", err)
 | 
			
		||||
		return []string{}
 | 
			
		||||
	}
 | 
			
		||||
	exPath := filepath.Dir(ex)
 | 
			
		||||
	data, err := ioutil.ReadFile(exPath + "/strings.json")
 | 
			
		||||
| 
						 | 
				
			
			@ -83,5 +84,9 @@ func main() {
 | 
			
		|||
		Server:      "irc.chat.twitch.tv",
 | 
			
		||||
		Prompts:     selectablePrompts,
 | 
			
		||||
	}
 | 
			
		||||
	go func() {
 | 
			
		||||
		rgb.YPrintf("[%s] Starting webserver on port %s\n", irc.TimeStamp(), "5353")
 | 
			
		||||
		webserver.HandleHTTP()
 | 
			
		||||
	}()
 | 
			
		||||
	myBot.Start()
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										108
									
								
								web/404.html
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								web/404.html
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,108 @@
 | 
			
		|||
      <html>
 | 
			
		||||
        <!doctype html>
 | 
			
		||||
        <html lang="en">
 | 
			
		||||
          <head>
 | 
			
		||||
            <meta charset="utf-8">
 | 
			
		||||
            <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
 | 
			
		||||
            <meta name="description" content="Templates files for the workshop">
 | 
			
		||||
            <meta name="author" content="Martyn Ranyard">
 | 
			
		||||
            <title>The k8s zoo</title>
 | 
			
		||||
        
 | 
			
		||||
            <!-- Bootstrap core CSS -->
 | 
			
		||||
            <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous">
 | 
			
		||||
            <!-- Custom styles for this template -->
 | 
			
		||||
            <link href="/cover.css" rel="stylesheet">
 | 
			
		||||
        
 | 
			
		||||
            <style>
 | 
			
		||||
              .bd-placeholder-img {
 | 
			
		||||
                font-size: 1.125rem;
 | 
			
		||||
                text-anchor: middle;
 | 
			
		||||
                -webkit-user-select: none;
 | 
			
		||||
                -moz-user-select: none;
 | 
			
		||||
                -ms-user-select: none;
 | 
			
		||||
                user-select: none;
 | 
			
		||||
              }
 | 
			
		||||
        
 | 
			
		||||
              @media (min-width: 768px) {
 | 
			
		||||
                .bd-placeholder-img-lg {
 | 
			
		||||
                  font-size: 3.5rem;
 | 
			
		||||
                }
 | 
			
		||||
                    }
 | 
			
		||||
                    
 | 
			
		||||
                    li.match-nomatch{
 | 
			
		||||
                        background-color: #1e2122;
 | 
			
		||||
                    }
 | 
			
		||||
                    li.match-matchtrack{
 | 
			
		||||
                        background-color: #E9B000;
 | 
			
		||||
                    }
 | 
			
		||||
                    li.match-fullmatch{
 | 
			
		||||
                        background-color: #008F95;
 | 
			
		||||
                    }
 | 
			
		||||
                    li.match-matchtrackfuzzt{
 | 
			
		||||
                        background-color: darkgray;
 | 
			
		||||
                    }
 | 
			
		||||
                    li.match-fullmatchfuzzy{
 | 
			
		||||
                        background-color: darkgray;
 | 
			
		||||
                    }
 | 
			
		||||
                    a{
 | 
			
		||||
                        text-decoration-line: underline;
 | 
			
		||||
                    }
 | 
			
		||||
        
 | 
			
		||||
            </style>
 | 
			
		||||
          </head>
 | 
			
		||||
          <body class="text-center">
 | 
			
		||||
                <div class="cover-container d-flex w-100 h-100 p-3 mx-auto flex-column">
 | 
			
		||||
                <header class="masthead mb-auto">
 | 
			
		||||
                <div class="inner">
 | 
			
		||||
                  <h3 class="masthead-brand">k8s-zoo</h3>
 | 
			
		||||
                  <nav class="nav nav-masthead justify-content-center">
 | 
			
		||||
                    <a class="nav-link active" href="/">Home</a>
 | 
			
		||||
                  </nav>
 | 
			
		||||
                </div>
 | 
			
		||||
                </header>
 | 
			
		||||
                <main role="main" class="inner cover">
 | 
			
		||||
                        <h1 class="cover-heading">Ooops!</h1>
 | 
			
		||||
                        <p>It seems you've gone somewhere you shouldn't!  404 NOT FOUND!</p>
 | 
			
		||||
                        <p/>
 | 
			
		||||
                        <p>This can happen if you enter the spotify id wrong and search, go back and check it!</p>
 | 
			
		||||
                            <p class="lead">Spotify IDs look like this : 37i9dQZF1DX4UtSsGT1Sbe - 22 characters and can be got by clicking share and "Copy (Playlist|Album) Link".</p>
 | 
			
		||||
                            <p>Shameless self-promotion : Follow me on twitch - <a href="https://www.twitch.tv/iMartynOnTwitch">iMartynOnTwitch</a>, oddly enough, I do a lot of twitchsings!</p>
 | 
			
		||||
                      </main>
 | 
			
		||||
        <footer class="mastfoot mt-auto">
 | 
			
		||||
                <div class="inner">
 | 
			
		||||
                  <p>Cover template for <a href="https://getbootstrap.com/">Bootstrap</a>, by <a href="https://twitter.com/mdo">@mdo</a>.</p>
 | 
			
		||||
                </div>
 | 
			
		||||
                </footer>
 | 
			
		||||
                </div>
 | 
			
		||||
                <script>
 | 
			
		||||
                function directToResults() {
 | 
			
		||||
                    var url = document.createElement('a');
 | 
			
		||||
                    url.setAttribute("href", window.location.href);
 | 
			
		||||
                    if ((url.port != 80) && (url.port != 443)) {
 | 
			
		||||
                        customPort = ":"+url.port
 | 
			
		||||
                    } else {
 | 
			
		||||
                        customPort = ""
 | 
			
		||||
                    }
 | 
			
		||||
                    var destination = url.protocol + "//" + url.hostname + customPort + "/" + document.getElementById("mode").value + "/" + document.getElementById("spotifyid").value
 | 
			
		||||
                    window.location.href = destination
 | 
			
		||||
                }
 | 
			
		||||
                
 | 
			
		||||
                function toggleUnfound() {
 | 
			
		||||
                    var unmatched = document.getElementsByClassName('match-nomatch'), i;
 | 
			
		||||
                    if (document.getElementById("showhidebutton").getAttribute("tracksHidden") != "true") {
 | 
			
		||||
                        document.getElementById("showhidebutton").setAttribute("tracksHidden","true")
 | 
			
		||||
                        for (i = 0; i < unmatched.length; i += 1) {
 | 
			
		||||
                                unmatched[i].style.display = 'none';
 | 
			
		||||
                        }
 | 
			
		||||
                    } else {
 | 
			
		||||
                        document.getElementById("showhidebutton").setAttribute("tracksHidden","false")
 | 
			
		||||
                        for (i = 0; i < unmatched.length; i += 1) {
 | 
			
		||||
                                unmatched[i].style.display = 'list-item';
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                </script>
 | 
			
		||||
                </body>
 | 
			
		||||
                </html>
 | 
			
		||||
    </body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										106
									
								
								web/cover.css
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								web/cover.css
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,106 @@
 | 
			
		|||
/*
 | 
			
		||||
* Globals
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/* Links */
 | 
			
		||||
a,
 | 
			
		||||
a:focus,
 | 
			
		||||
a:hover {
 | 
			
		||||
 color: #fff;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Custom default button */
 | 
			
		||||
.btn-secondary,
 | 
			
		||||
.btn-secondary:hover,
 | 
			
		||||
.btn-secondary:focus {
 | 
			
		||||
 color: #333;
 | 
			
		||||
 text-shadow: none; /* Prevent inheritance from body */
 | 
			
		||||
 background-color: #fff;
 | 
			
		||||
 border: .05rem solid #fff;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
* Base structure
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
html,
 | 
			
		||||
body {
 | 
			
		||||
 height: 100%;
 | 
			
		||||
 background-color: #333;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
body {
 | 
			
		||||
 display: -ms-flexbox;
 | 
			
		||||
 display: flex;
 | 
			
		||||
 color: #fff;
 | 
			
		||||
 text-shadow: 0 .05rem .1rem rgba(0, 0, 0, .5);
 | 
			
		||||
 box-shadow: inset 0 0 5rem rgba(0, 0, 0, .5);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.cover-container {
 | 
			
		||||
 max-width: 142em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
* Header
 | 
			
		||||
*/
 | 
			
		||||
.masthead {
 | 
			
		||||
 margin-bottom: 2rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.masthead-brand {
 | 
			
		||||
 margin-bottom: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.nav-masthead .nav-link {
 | 
			
		||||
 padding: .25rem 0;
 | 
			
		||||
 font-weight: 700;
 | 
			
		||||
 color: rgba(255, 255, 255, .5);
 | 
			
		||||
 background-color: transparent;
 | 
			
		||||
 border-bottom: .25rem solid transparent;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.nav-masthead .nav-link:hover,
 | 
			
		||||
.nav-masthead .nav-link:focus {
 | 
			
		||||
 border-bottom-color: rgba(255, 255, 255, .25);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.nav-masthead .nav-link + .nav-link {
 | 
			
		||||
 margin-left: 1rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.nav-masthead .active {
 | 
			
		||||
 color: #fff;
 | 
			
		||||
 border-bottom-color: #fff;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media (min-width: 48em) {
 | 
			
		||||
 .masthead-brand {
 | 
			
		||||
   float: left;
 | 
			
		||||
 }
 | 
			
		||||
 .nav-masthead {
 | 
			
		||||
   float: right;
 | 
			
		||||
 }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
* Cover
 | 
			
		||||
*/
 | 
			
		||||
.cover {
 | 
			
		||||
 padding: 0 1.5rem;
 | 
			
		||||
}
 | 
			
		||||
.cover .btn-lg {
 | 
			
		||||
 padding: .75rem 1.25rem;
 | 
			
		||||
 font-weight: 700;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
* Footer
 | 
			
		||||
*/
 | 
			
		||||
.mastfoot {
 | 
			
		||||
 color: rgba(255, 255, 255, .5);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										90
									
								
								web/index.html
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								web/index.html
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,90 @@
 | 
			
		|||
<html>
 | 
			
		||||
        <!doctype html>
 | 
			
		||||
        <html lang="en">
 | 
			
		||||
          <head>
 | 
			
		||||
            <meta charset="utf-8">
 | 
			
		||||
            <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
 | 
			
		||||
            <meta name="description" content="Karaokards bot for twitch chat">
 | 
			
		||||
            <meta name="author" content="Martyn Ranyard">
 | 
			
		||||
            <title>Karaokards</title>
 | 
			
		||||
        
 | 
			
		||||
            <!-- Bootstrap core CSS -->
 | 
			
		||||
            <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous">
 | 
			
		||||
            <!-- Custom styles for this template -->
 | 
			
		||||
            <link href="/cover.css" rel="stylesheet">
 | 
			
		||||
        
 | 
			
		||||
            <style>
 | 
			
		||||
              .bd-placeholder-img {
 | 
			
		||||
                font-size: 1.125rem;
 | 
			
		||||
                text-anchor: middle;
 | 
			
		||||
                -webkit-user-select: none;
 | 
			
		||||
                -moz-user-select: none;
 | 
			
		||||
                -ms-user-select: none;
 | 
			
		||||
                user-select: none;
 | 
			
		||||
              }
 | 
			
		||||
        
 | 
			
		||||
              @media (min-width: 768px) {
 | 
			
		||||
                .bd-placeholder-img-lg {
 | 
			
		||||
                  font-size: 3.5rem;
 | 
			
		||||
                }
 | 
			
		||||
                    }
 | 
			
		||||
                    
 | 
			
		||||
                    li.match-nomatch{
 | 
			
		||||
                        background-color: #1e2122;
 | 
			
		||||
                    }
 | 
			
		||||
                    li.match-matchtrack{
 | 
			
		||||
                        background-color: #E9B000;
 | 
			
		||||
                    }
 | 
			
		||||
                    li.match-fullmatch{
 | 
			
		||||
                        background-color: #008F95;
 | 
			
		||||
                    }
 | 
			
		||||
                    li.match-matchtrackfuzzt{
 | 
			
		||||
                        background-color: darkgray;
 | 
			
		||||
                    }
 | 
			
		||||
                    li.match-fullmatchfuzzy{
 | 
			
		||||
                        background-color: darkgray;
 | 
			
		||||
                    }
 | 
			
		||||
                    a{
 | 
			
		||||
                        text-decoration-line: underline;
 | 
			
		||||
                    }
 | 
			
		||||
        
 | 
			
		||||
            </style>
 | 
			
		||||
          </head>
 | 
			
		||||
          <body class="text-center">
 | 
			
		||||
                <div class="cover-container d-flex w-100 h-100 p-3 mx-auto flex-column">
 | 
			
		||||
                <header class="masthead mb-auto">
 | 
			
		||||
                <div class="inner">
 | 
			
		||||
                  <h3 class="masthead-brand">k8s-zoo</h3>
 | 
			
		||||
                  <nav class="nav nav-masthead justify-content-center">
 | 
			
		||||
                    <a class="nav-link active" href="/">Home</a>
 | 
			
		||||
                  </nav>
 | 
			
		||||
                </div>
 | 
			
		||||
                </header>
 | 
			
		||||
                <main role="main" class="inner cover">
 | 
			
		||||
                        <h1 class="cover-heading">Karaokards!!!</h1>
 | 
			
		||||
                        <p>Random prompt for you : {{.Prompt}}</p>
 | 
			
		||||
                        <p>There are a total of {{.AvailCount}} prompts available.</p>
 | 
			
		||||
                </main>
 | 
			
		||||
        <footer class="mastfoot mt-auto">
 | 
			
		||||
                <div class="inner">
 | 
			
		||||
                  <p>Cover template for <a href="https://getbootstrap.com/">Bootstrap</a>, by <a href="https://twitter.com/mdo">@mdo</a>.</p>
 | 
			
		||||
                </div>
 | 
			
		||||
                </footer>
 | 
			
		||||
                </div>
 | 
			
		||||
                <script>
 | 
			
		||||
                function releaseAnimal() {
 | 
			
		||||
                    var url = document.createElement('a');
 | 
			
		||||
                    url.setAttribute("href", window.location.href);
 | 
			
		||||
                    if ((url.port != 80) && (url.port != 443)) {
 | 
			
		||||
                        customPort = ":"+url.port
 | 
			
		||||
                    } else {
 | 
			
		||||
                        customPort = ""
 | 
			
		||||
                    }
 | 
			
		||||
                    var destination = url.protocol + "//" + url.hostname + customPort + "/release"
 | 
			
		||||
                    window.location.href = destination
 | 
			
		||||
                }
 | 
			
		||||
                </script>
 | 
			
		||||
                </body>
 | 
			
		||||
                </html>
 | 
			
		||||
    </body>
 | 
			
		||||
</html>
 | 
			
		||||
		Loading…
	
	Add table
		
		Reference in a new issue