Da es hier offensichtlich NodeJS ist und kein Vanilla JS, ist es Serverside.
Beiträge von LeonMrBonnie
-
-
Wird denn nur die Property "status" vom Objekt verändert, oder setzt du beim Webserver auch den Header Statuscode zu 200?
Sonst vielleicht mal https://www.npmjs.com/package/request das hier versuchen.JavaScript
Alles anzeigenconst request = require("request"); const apiHost = "https://google.de"; const apiSecret = "SECRET123"; function loginUser(username, password, callback) { if(!username || !password || typeof callback !== "function") return console.error(`loginUser was called with invalid parameters`); // Die angegeben Parameter sind falsch request({ url: `${apiHost}/index.php?user-api&method=login&username=${username}&password=${password}&secret=${apiSecret}`, // Die Daten des Users werden in die URL geschrieben headers: { 'User-Agent': 'Projekt Reallife Agent 1.0.0' } }, (error, response, body) => { let status = response.statusCode; if(status !== 200 || error) // Die Antwort war nicht 200, also ist irgendwas schief gelaufen { if(!error) callback({ Status: status, Error: "The server did not respond with 200 - OK" }); else callback({ Status: status, Error: error }); } else { let parsed = JSON.parse(body); callback(null, { id: parsed.userID, email: parsed.email, groups: parsed.groups }); } }); } -
Ich meine von http.get zu https.get ändern.
-
http.get ?
-
Ja, dann musst du natürlich das https Package nehmen und nicht http.
-
const apiHost = "https://www.projekt-xyz.de";
zu
const apiHost = "projekt-xyz.de";Ist anscheinend irgendein komisches Problem mit dem HTTP Package.
-
Hast du auch das http Package requiret? Versuch mal innerhalb der loginUser Funktion ein paar Logs zu platzieren und guck wo es stehen bleibt.
-
JavaScript
Alles anzeigenmp.events.add("sendDataToServer", (player, username, password, state) => { let loggedAccount = mp.players.toArray().find(p => p.loggedInAs == username); switch(state){ //Account Login case 0: { if(loggedAccount){ console.log("Logged in already."); player.call("loginHandler", ["logged"]); } else { function loginUser(username, password, callback) { if(!username || !password || typeof callback !== "function") return console.error(`loginUser was called with invalid parameters`); // Die angegeben Parameter sind falsch http.get({ host: `${apiHost}`, path: `/index.php?user-api&method=login&username=${username}&password=${password}&secret=${apiSecret}`, // Die Daten des Users werden in die URL geschrieben headers: { 'User-Agent': 'Projekt Reallife Agent 1.0.0' } }, (response) => { let status = response.statusCode; if(status !== 200) // Die Antwort war nicht 200, also ist irgendwas schief gelaufen { response.resume(); // Den Rest der Anfrage verarbeiten, damit kein Memory Overflow entsteht callback({ Status: status, Error: "The server did not respond with 200 - OK" }); } else { let data = ""; response.on('data', (chunk) => { data += chunk; }); response.on('end', () => { let parsed = JSON.parse(data); callback(null, { id: parsed.userID, email: parsed.email, groups: parsed.groups }); }); } }); } loginUser(username, password, (error, data) => { console.log(JSON.stringify(data)); if(error) { if(error.Status === 412) return player.call("loginHandler", ["incorrectinfo"]); // Falscher Name/Passwort else return console.log(error.Error); // Bei einem Error sind keine Daten vorhanden, also muss returnt werden, damit der 2. Parameter nicht verwendet wird } if(data.groups.find(group => group.groupID === 6)) { player.name = username; player.call("loginHandler", ["success"]); gm.auth.loadAccount(player); } else { player.call("loginHandler", ["incorrectinfo"]); } }); } break; } //Account Registration case 1: { if(username.length >= 3 && pass.length >= 5){ gm.mysql.handle.query('SELECT * FROM `accounts` WHERE `username` = ?', [username], function(err, res){ if(res.length > 0){ player.call("loginHandler", ["takeninfo"]); } else { bcrypt.hash(pass, function(err, hash) { if(!err){ gm.mysql.handle.query('INSERT INTO `accounts` SET username = ?, password = ?', [username, hash], function(err, res){ if(!err){ player.name = username; console.log("\x1b[92m" + username + "\x1b[39m has just registered."); } else { console.log("\x1b[31m[ERROR] " + err) } }); } else { console.log("\x1b[31m[BCrypt]: " + err) } }); } }); } else { player.call("loginHandler", ["tooshort"]); } break; } default: { player.outputChatBox("An error has occured, please contact your server administrator.") console.log("\x1b[31m[ERROR] Login/Register state was one that isn't defined. State: " + state) break; } } });Versuch mal die Daten stringified zu printen. Dazu hast du auch statt dem data Parameter parsed verwendet, die Variable ist aber nur innerhalb der Funktion.
-
was zahlt man für ein ucp
Geld.
Komplett unterschiedlich abhängig von den Features, die Frage ist wie viel du bereit bist auszugeben. -
-
Hat keiner bestritten, nur sind die Fragen etwas dumm.
Statt den Threadersteller hier dumm von der Seite anzumachen kannst du es auch einfach komplett ignorieren oder du hilfst ihm. Deine Beiträge bringen hier niemanden auch nur ansatzweise weiter.
Wie vorher gefragt;
Wenn du selber eins erstellen willst, hast du schon Vorerfahrung? Weißt du was es können soll?
Wenn du eins kaufen willst, wie viel möchtest du maximal ausgeben? -
Ein Becks - ~1,25
-
Der Server brauch wahrscheinlich eine MySQL Datenbank, nicht eine SQLite Datenbank. Deswegen funktioniert es auch nicht.
Du kannst mit Programmen wie WAMP, XAMPP oder MAMP (ja die heißen echt so) einen MySQL Server lokal aufsetzen. -
JavaScript
Alles anzeigenconst apiHost = "https://testseite.de"; const apiSecret = "SECRET123"; function loginUser(username, password, callback) { if(!username || !password || typeof callback !== "function") return console.error(`loginUser was called with invalid parameters`); // Die angegeben Parameter sind falsch http.get({ host: `${apiHost}`, path: `/index.php?user-api&method=login&username=${username}&password=${password}&secret=${apiSecret}`, // Die Daten des Users werden in die URL geschrieben headers: { 'User-Agent': 'Projekt Reallife Agent 1.0.0' } }, (response) => { let status = response.statusCode; if(status !== 200) // Die Antwort war nicht 200, also ist irgendwas schief gelaufen { response.resume(); // Den Rest der Anfrage verarbeiten, damit kein Memory Overflow entsteht callback(`Request failed. Server responded with status code ${status}`); } else { let data = ""; response.on('data', (chunk) => { data += chunk; }); response.on('end', () => { let parsed = JSON.parse(data); callback(null, { id: parsed.userID, email: parsed.email, groups: parsed.groups }); }); } }); }Der erste Parameter des Callbacks ist der Fehler, falls keiner vorhanden ist, ist dieser null. Der zweite Parameter sind die empfangenen Daten.
Du nutzt es also so: -
Guten Morgen!
Da kein Problem mit dem Keybinder an sich vorlag. Dieser Funktioniert einwandfrei. Es lag lediglich daran, dass SAMP AC installiert warUnd? Vielleicht haben andere genau die gleiche Frage. Es bringt niemanden weiter seine Fragen zu löschen. Wenn es dir zu peinlich ist, dass du eine Frage gestellt hast, dann frag garnicht erst.
-
Du erweiterst die Funktion um 2 Parameter, Name und Passwort, dann kannst du mit diesen Variablen die URL für die Anfrage zusammensetzen. Da es eine HTTP Anfrage ist, würd es sich auch lohnen Promises zu verwenden. (Async/await) Dann kannst du das Callback weglassen. Ist aber natürlich deine Entscheidung ob du den klassischen Callbackstil von NodeJS verwendest oder es mit einer modernen Methode (Promises) machst.
-
Warum verbindest du dich nicht einfach zum MySQL Server des Forums auf deinem NodeJS Server? Wenn der Gameserver vom Forum abhängig ist, sorgt das eher für Probleme. (Forum Mal down = Niemand kann sich auf dem Server einloggen)
Auch sendest du dann dort Name und Passwort des Nutzers nicht nur von Client zu Server sondern nochmal weiter übers Internet zu einem weiteren Server. Stichwort: Datensicherheit -
https://wiki.rage.mp/index.php?title=Marker::Marker
Codelet marker = mp.markers.new(0, new mp.Vector3(0.0, 0.0, 0.0), 1); // Im Key Handler für E if(mp.game.system.vdist(mp.players.local.position.x, mp.players.local.position.y, mp.players.local.position.z, marker.position.x, marker.position.y, marker.position.z) < 2.5) mp.events.callRemote("markerPosition"); -
Mit mp.keys.bind einen neuen Handler für die E-Taste setzen, in diesem Handler fragst du ab ob der Spieler in der Nähe von dem Marker ist, wenn ja dann teleportierst du den Spieler in das Interior. (mp.keys.bind ist clientside, und das teleportieren machst du serverside)
-
Du installierst es einfach ganz normal für GTA V und dann funktioniert es automatisch in RageMP.