diff --git a/backend/background.png b/backend/background.png deleted file mode 100644 index 39e67aa..0000000 Binary files a/backend/background.png and /dev/null differ diff --git a/backend/classes/Crafatar.php b/backend/classes/Crafatar.php new file mode 100644 index 0000000..7f80448 --- /dev/null +++ b/backend/classes/Crafatar.php @@ -0,0 +1,36 @@ +uuid = $this->getPlayerUUID($username); + $this->url = "https://crafatar.com/renders/body/{$this->uuid}?scale={$scale}"; + + $this->data = $this->curl(); + $this->image = imagecreatefromstring($this->data); + $this->size = [imagesx($this->image),imagesy($this->image)]; + } + + // Get player UUID from username + private function getPlayerUUID($username) { + $url = "https://playerdb.co/api/player/minecraft/"; + + $api = json_decode(file_get_contents($url.$username)); + return $api->data->player->id; + } + + private function curl() { + $curl = curl_init(); + + curl_setopt($curl, CURLOPT_URL, $this->url); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // good edit, thanks! + curl_setopt($curl, CURLOPT_BINARYTRANSFER, 1); // also, this seems wise considering output is image. + + $data = curl_exec($curl); + curl_close($curl); + + return $data; + } + + } \ No newline at end of file diff --git a/backend/classes/Minotar.php b/backend/classes/Minotar.php new file mode 100644 index 0000000..1fd07dc --- /dev/null +++ b/backend/classes/Minotar.php @@ -0,0 +1,27 @@ +url = "https://minotar.net/armor/bust/{$username}/{$size}.png"; + + $this->data = $this->curl(); + $this->image = imagecreatefromstring($this->data); + $this->size = [imagesx($this->image),imagesy($this->image)]; + } + + private function curl() { + $curl = curl_init(); + + curl_setopt($curl, CURLOPT_URL, $this->url); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // good edit, thanks! + curl_setopt($curl, CURLOPT_BINARYTRANSFER, 1); // also, this seems wise considering output is image. + + $data = curl_exec($curl); + curl_close($curl); + + return $data; + } + + } \ No newline at end of file diff --git a/backend/classes/TextLayer.php b/backend/classes/TextLayer.php new file mode 100644 index 0000000..0a0d5e7 --- /dev/null +++ b/backend/classes/TextLayer.php @@ -0,0 +1,44 @@ +text = $text; + $this->font = $font; + + $this->size = $this->scaleFont($text,$size); + $this->setFontPath(); + } + + // Prevent default GD font lookup path from being used + private function setFontPath() { + putenv("GDFONTPATH=".realpath("./".$this->font)); + } + + // Calculate scaled front size from max-width + private function scaleFont($text,$baseline) { + $len = strlen($this->text); + + $log = $len / 0.6; + $size = $baseline - $log; + + return $size; + } + + // Center text + private function offsetX($x) { + $len = strlen($this->text); + + $offset = $x - ($len * ($this->size / 2.2)); + + return $offset; + } + + // Image resource, x, y + public function textcopy($image,$x,$y,$color) { + imagettftext($image,$this->size,0,$this->offsetX($x),$y,$color,"font",$this->text); + return true; + } + + } \ No newline at end of file diff --git a/backend/render.php b/backend/render.php deleted file mode 100644 index e69de29..0000000 diff --git a/backend/servers.json b/backend/servers.json deleted file mode 100644 index e69de29..0000000 diff --git a/backend/servers/us.mineplex.com/bg.png b/backend/servers/us.mineplex.com/bg.png new file mode 100644 index 0000000..74d9f3f Binary files /dev/null and b/backend/servers/us.mineplex.com/bg.png differ diff --git a/backend/servers/us.mineplex.com/font.ttf b/backend/servers/us.mineplex.com/font.ttf new file mode 100644 index 0000000..9efe680 Binary files /dev/null and b/backend/servers/us.mineplex.com/font.ttf differ diff --git a/backend/servers/us.mineplex.com/tags/admin.png b/backend/servers/us.mineplex.com/tags/admin.png new file mode 100644 index 0000000..f1337a6 Binary files /dev/null and b/backend/servers/us.mineplex.com/tags/admin.png differ diff --git a/backend/servers/us.mineplex.com/tags/eternal.png b/backend/servers/us.mineplex.com/tags/eternal.png new file mode 100644 index 0000000..bf14fcb Binary files /dev/null and b/backend/servers/us.mineplex.com/tags/eternal.png differ diff --git a/backend/servers/us.mineplex.com/tags/hero.png b/backend/servers/us.mineplex.com/tags/hero.png new file mode 100644 index 0000000..3be03dd Binary files /dev/null and b/backend/servers/us.mineplex.com/tags/hero.png differ diff --git a/backend/servers/us.mineplex.com/tags/immortal.png b/backend/servers/us.mineplex.com/tags/immortal.png new file mode 100644 index 0000000..a986870 Binary files /dev/null and b/backend/servers/us.mineplex.com/tags/immortal.png differ diff --git a/backend/servers/us.mineplex.com/tags/leader.png b/backend/servers/us.mineplex.com/tags/leader.png new file mode 100644 index 0000000..12c1c74 Binary files /dev/null and b/backend/servers/us.mineplex.com/tags/leader.png differ diff --git a/backend/servers/us.mineplex.com/tags/legend.png b/backend/servers/us.mineplex.com/tags/legend.png new file mode 100644 index 0000000..2c3c3b6 Binary files /dev/null and b/backend/servers/us.mineplex.com/tags/legend.png differ diff --git a/backend/servers/us.mineplex.com/tags/mod.png b/backend/servers/us.mineplex.com/tags/mod.png new file mode 100644 index 0000000..1872f67 Binary files /dev/null and b/backend/servers/us.mineplex.com/tags/mod.png differ diff --git a/backend/servers/us.mineplex.com/tags/owner.png b/backend/servers/us.mineplex.com/tags/owner.png new file mode 100644 index 0000000..33d64c0 Binary files /dev/null and b/backend/servers/us.mineplex.com/tags/owner.png differ diff --git a/backend/servers/us.mineplex.com/tags/srmod.png b/backend/servers/us.mineplex.com/tags/srmod.png new file mode 100644 index 0000000..8837307 Binary files /dev/null and b/backend/servers/us.mineplex.com/tags/srmod.png differ diff --git a/backend/servers/us.mineplex.com/tags/titan.png b/backend/servers/us.mineplex.com/tags/titan.png new file mode 100644 index 0000000..84a0076 Binary files /dev/null and b/backend/servers/us.mineplex.com/tags/titan.png differ diff --git a/backend/servers/us.mineplex.com/tags/trainee.png b/backend/servers/us.mineplex.com/tags/trainee.png new file mode 100644 index 0000000..23124d7 Binary files /dev/null and b/backend/servers/us.mineplex.com/tags/trainee.png differ diff --git a/backend/servers/us.mineplex.com/tags/ultra.png b/backend/servers/us.mineplex.com/tags/ultra.png new file mode 100644 index 0000000..40cd849 Binary files /dev/null and b/backend/servers/us.mineplex.com/tags/ultra.png differ diff --git a/backend/tags/us.mineplex.com/rank_admin.png b/backend/tags/us.mineplex.com/rank_admin.png deleted file mode 100644 index 5114661..0000000 Binary files a/backend/tags/us.mineplex.com/rank_admin.png and /dev/null differ diff --git a/backend/tags/us.mineplex.com/rank_eternal.png b/backend/tags/us.mineplex.com/rank_eternal.png deleted file mode 100644 index 27cb96f..0000000 Binary files a/backend/tags/us.mineplex.com/rank_eternal.png and /dev/null differ diff --git a/backend/tags/us.mineplex.com/rank_hero.png b/backend/tags/us.mineplex.com/rank_hero.png deleted file mode 100644 index 1d3fc33..0000000 Binary files a/backend/tags/us.mineplex.com/rank_hero.png and /dev/null differ diff --git a/backend/tags/us.mineplex.com/rank_immortal.png b/backend/tags/us.mineplex.com/rank_immortal.png deleted file mode 100644 index 6aaaf59..0000000 Binary files a/backend/tags/us.mineplex.com/rank_immortal.png and /dev/null differ diff --git a/backend/tags/us.mineplex.com/rank_leader.png b/backend/tags/us.mineplex.com/rank_leader.png deleted file mode 100644 index 1974f5d..0000000 Binary files a/backend/tags/us.mineplex.com/rank_leader.png and /dev/null differ diff --git a/backend/tags/us.mineplex.com/rank_legend.png b/backend/tags/us.mineplex.com/rank_legend.png deleted file mode 100644 index 99c31b7..0000000 Binary files a/backend/tags/us.mineplex.com/rank_legend.png and /dev/null differ diff --git a/backend/tags/us.mineplex.com/rank_mod.png b/backend/tags/us.mineplex.com/rank_mod.png deleted file mode 100644 index 8c03034..0000000 Binary files a/backend/tags/us.mineplex.com/rank_mod.png and /dev/null differ diff --git a/backend/tags/us.mineplex.com/rank_owner.png b/backend/tags/us.mineplex.com/rank_owner.png deleted file mode 100644 index 88c63f8..0000000 Binary files a/backend/tags/us.mineplex.com/rank_owner.png and /dev/null differ diff --git a/backend/tags/us.mineplex.com/rank_srmod.png b/backend/tags/us.mineplex.com/rank_srmod.png deleted file mode 100644 index d04e835..0000000 Binary files a/backend/tags/us.mineplex.com/rank_srmod.png and /dev/null differ diff --git a/backend/tags/us.mineplex.com/rank_titan.png b/backend/tags/us.mineplex.com/rank_titan.png deleted file mode 100644 index 0d71137..0000000 Binary files a/backend/tags/us.mineplex.com/rank_titan.png and /dev/null differ diff --git a/backend/tags/us.mineplex.com/rank_trainee.png b/backend/tags/us.mineplex.com/rank_trainee.png deleted file mode 100644 index f1761f3..0000000 Binary files a/backend/tags/us.mineplex.com/rank_trainee.png and /dev/null differ diff --git a/backend/tags/us.mineplex.com/rank_ultra.png b/backend/tags/us.mineplex.com/rank_ultra.png deleted file mode 100644 index eef219f..0000000 Binary files a/backend/tags/us.mineplex.com/rank_ultra.png and /dev/null differ diff --git a/backend/texture.php b/backend/texture.php new file mode 100644 index 0000000..48ac767 --- /dev/null +++ b/backend/texture.php @@ -0,0 +1,69 @@ +input = [ + "server" => $_GET["server"], + "username" => $_GET["username"], + "tag" => $_GET["tag"].".png" + ]; + + $this->path = "servers/{$this->input["server"]}/"; + + $this->validate(); + } + + // Make sure all required urlparams are set + private function validate() { + foreach($this->input as $key => $value) { + if(!$value) { + $error[] = "Missing urlparam: '{$key}'."; + } + } + + if($error) { + http_response_code("400 Bad Request"); + echo implode(" ",$error); + die(); + } + + return true; + } + + // Create a new texture + function create($x,$y) { + // Layers + $bg = imagecreatefrompng($this->path."bg.png"); + $player = new Minotar($this->input["username"],100); + $name = new TextLayer($this->input["username"],$this->path,30); + $tag = imagecreatefrompng($this->path."tags/".$this->input["tag"]); + + // Create texture + $image = imagecreatetruecolor($x,$y); + $alpha = imagecolorallocatealpha($image,0,0,0,127); + $color = imagecolorallocate($image,255,255,255); + + // Preserve transparency + imagefill($image,0,0,$alpha); + imagesavealpha($image,true); + + // Blend layers + imagecopy($image,$bg,0,0,0,0,$x,$y); // Background + imagecopy($image,$player->image,45,60,0,0,$player->size[0],$player->size[1]); // Player avatar + $name->textcopy($image,110,210,$color); // Player name + imagecopy($image,$tag,0,0,0,0,$x,$y); // Player rank + + // Output image + header("Content-Type: image/png"); + echo imagepng($image);; + } + + } + + $texture = new Texture(); + $texture->create(355,275); \ No newline at end of file diff --git a/start.py b/start.py index 9f6c88c..81b3b3f 100644 --- a/start.py +++ b/start.py @@ -13,7 +13,7 @@ class Chattycape(Thread): pollRate = 1 # Logfile pollrate - updateRate = 1 # Update rate of Labylib cosmetic + updateRate = 15 # Update rate of Labylib cosmetic def __init__(self,event,phpsessid,endpoint,logfile,me = "None"): Thread.__init__(self) @@ -23,7 +23,7 @@ def __init__(self,event,phpsessid,endpoint,logfile,me = "None"): self.server = None # Connected to server (hostname) self.config = None # Chat config for current server - self.line = "[21:42:25] [main/INFO]: [CHAT] 725 IMMORTAL VicW test" + self.line = "" self.i = 0 # Read last line from logfile @@ -52,7 +52,7 @@ def getUser(self): continue if substr in tagList: - tag = substr + tag = substr.lower() continue # Not ignored, and not a tag, so assume we've reached the username @@ -65,7 +65,7 @@ def getUser(self): def update(self): args = self.getUser() # Get minecraft username and tag - urlparams = f"?server={self.server}&ign={args[0]}&rank={args[1]}" + urlparams = f"?server={self.server}&username={args[0]}&tag={args[1]}" # Save cape texture from endpoint to disk with open(".cache.png","wb") as handle: @@ -80,7 +80,8 @@ def update(self): handle.write(block) - # TODO: Labylib here + cape = Cape.Texture(self.params[0],".cache.png") + cape.update() # ---------------------------- @@ -118,7 +119,7 @@ def __init__(self): print("-- Labylib Chattycape --") self.logfile = self.locate() - self.endpoint = self.prompt("Cape render endpoint","http://192.168.86.21/victor-westerlund/labylib-chattycape/back-end/render.php") + self.endpoint = self.prompt("Cape render endpoint","https://api.victorwesterlund.com/chattycape") self.me = self.prompt("My Minecraft in-game name (Case Sensitive)","Don't exclude me") self.phpsessid = self.prompt("PHPSESSID cookie") @@ -168,7 +169,7 @@ def locate(self): # Failed to locate Minecraft-installation automatically - path = self.prompt("Path to your '.minecraft'-folder","/mnt/c/Users/victo/AppData/Roaming/.minecraft") + path = self.prompt("Path to your '.minecraft'-folder") if(Path(path).exists()): return path + mclog