- Poeki
MEMBRO - Mensagens : 53
Data de inscrição : 16/09/2015
Idade : 25
Game server + "Web server"
Sex Dez 01, 2017 4:30 am
Todas edições são feita direto no seu servidor (Source)
Eu estava aqui pensando na vida e fazendo meus bangs até que uma ideia me surgiu, colocar uma porta pra solicitações como por exemplo obter informações de um determinado usuário, confesso que não sei se existe outro modo mais fácil
Lá vai...
primeiro faça o import necessário
agora cria uma 'class' para o web server
E por fim abre a porta pro web server (no caso é 8080)
E fim, pra entrar nesse servidor vocês devem usar http://localhost:8080
Agora a parte sobre pegar os dados:
Na def render_GET você vai receber a solicitação e "return" os dados que vão aparecer para o client
E com isso você pode usar o request.uri Para obter o "valor" que você pode usar para enviar os dados de um jogador por exemplo, segue:
Com esse código ai em cima ele iria verificar os clients na lista self.server.players e retornar se o client do "Danilo" do http://localhost/users/Danilo está online ou não
etc... (preguiça de continuar escrevendo)
Se alguém souber um modo mais fácil e quiser compartilhar, obg, conhecimento nunca é de mais
Obs: Com isso vocês podem também criar um ranking externo mesmo com o servidor em sqlite
Obs²: Caso deseje usar para muitas coisas por exemplo informações de usuários e informações de tribos tentem usar algo como:
http://localhost/tribe/TriboTal
http://localhost/user/Fulano
(Não coloca tudo na raiz, vai por mim)
Links:
Usando modo POST
Exemplo usado (GET)
Eu estava aqui pensando na vida e fazendo meus bangs até que uma ideia me surgiu, colocar uma porta pra solicitações como por exemplo obter informações de um determinado usuário, confesso que não sei se existe outro modo mais fácil
Lá vai...
primeiro faça o import necessário
- Código:
from twisted.web import server, resource
agora cria uma 'class' para o web server
- Código:
class Simple(resource.Resource):
isLeaf = True
def render_GET(self, request):
return "<html>Hello, world!</html>"
E por fim abre a porta pro web server (no caso é 8080)
- Código:
site = server.Site(Simple())
reactor.listenTCP(8080, site)
E fim, pra entrar nesse servidor vocês devem usar http://localhost:8080
Agora a parte sobre pegar os dados:
Na def render_GET você vai receber a solicitação e "return" os dados que vão aparecer para o client
E com isso você pode usar o request.uri Para obter o "valor" que você pode usar para enviar os dados de um jogador por exemplo, segue:
- Código:
if request.uri.startswith("/users/"):
name = request.uri.split("/users/")[1]
if name != "":
for player in self.server.playerlist:
if player.username == name:
return "On"
else:
return "Off"
Com esse código ai em cima ele iria verificar os clients na lista self.server.players e retornar se o client do "Danilo" do http://localhost/users/Danilo está online ou não
etc... (preguiça de continuar escrevendo)
Se alguém souber um modo mais fácil e quiser compartilhar, obg, conhecimento nunca é de mais
Obs: Com isso vocês podem também criar um ranking externo mesmo com o servidor em sqlite
Obs²: Caso deseje usar para muitas coisas por exemplo informações de usuários e informações de tribos tentem usar algo como:
http://localhost/tribe/TriboTal
http://localhost/user/Fulano
(Não coloca tudo na raiz, vai por mim)
Links:
Usando modo POST
Exemplo usado (GET)
- Poeki
MEMBRO - Mensagens : 53
Data de inscrição : 16/09/2015
Idade : 25
POST
Sex Dez 01, 2017 4:57 am
Eis aqui o exemplo de um formulário:
Entrando no http://localhost:8880/form você recebe uma caixinha de texto para enviar o texto para o servidor e com esse script ele vai retornar o para o cliente "You submitted: (texto digitado na caixinha)". Com isso você consegue criar um console externo e/ou enviar pacotes para o servidor e jogadores online sem ter que entrar no jogo em sí, de nada
Link: Handling POSTs
- Código:
from twisted.web.server import Site
from twisted.web.resource import Resource
from twisted.internet import reactor
import cgi
class FormPage(Resource):
def render_GET(self, request):
return '<html><body><form method="POST"><input name="the-field" type="text" /></form></body></html>'
def render_POST(self, request):
return '<html><body>You submitted: %s</body></html>' % (cgi.escape(request.args["the-field"][0]),)
root = Resource()
root.putChild("form", FormPage())
factory = Site(root)
reactor.listenTCP(8880, factory)
reactor.run()
Entrando no http://localhost:8880/form você recebe uma caixinha de texto para enviar o texto para o servidor e com esse script ele vai retornar o para o cliente "You submitted: (texto digitado na caixinha)". Com isso você consegue criar um console externo e/ou enviar pacotes para o servidor e jogadores online sem ter que entrar no jogo em sí, de nada
Link: Handling POSTs
- Poeki
MEMBRO - Mensagens : 53
Data de inscrição : 16/09/2015
Idade : 25
Login
Sex Dez 01, 2017 5:47 am
E para finalizar...
Eis aqui um script que você precisa digitar um usuário e senha antes de ver o conteúdo do site:
Link: Twisted11 Basic Auth using Password Dictionary
Link: [Twisted-Python] how to implement login form logic with twisted.cred checkers, credentials and portal
OBS: NÃO TENHO CRÉDITO POR NENHUM DOS SCRIPTS NESTE POST
Eis aqui um script que você precisa digitar um usuário e senha antes de ver o conteúdo do site:
- Código:
#!/usr/bin/env python
from zope.interface import implements
from twisted.cred import portal, checkers, credentials, error as credError
from twisted.internet import defer, reactor
from twisted.web import static, resource
from twisted.web.resource import IResource
from twisted.web.http import HTTPChannel
from twisted.web import server
from twisted.web.guard import HTTPAuthSessionWrapper
from twisted.web.guard import DigestCredentialFactory
from twisted.web.guard import BasicCredentialFactory
class PasswordDictChecker:
implements(checkers.ICredentialsChecker)
credentialInterfaces = (credentials.IUsernamePassword,)
def __init__(self, passwords):
"passwords: a dict-like object mapping usernames to passwords"
self.passwords = passwords
def requestAvatarId(self, credentials):
username = credentials.username
if self.passwords.has_key(username):
if credentials.password == self.passwords[username]:
return defer.succeed(username)
else:
return defer.fail(
credError.UnauthorizedLogin("Bad password"))
else:
return defer.fail(
credError.UnauthorizedLogin("No such user"))
class HttpPasswordRealm(object):
implements(portal.IRealm)
def __init__(self, myresource):
self.myresource = myresource
def requestAvatar(self, user, mind, *interfaces):
if IResource in interfaces:
# myresource is passed on regardless of user
return (IResource, self.myresource, lambda: None)
raise NotImplementedError()
class MyResource(resource.Resource):
def __init__(self):
resource.Resource.__init__(self)
def getChild(self, path, request):
text = "You're in. The path is /%s." % path
return static.Data(text, "text/plain")
passwords = {
'admin': 'aaa',
'user1': 'bbb',
'user2': 'ccc'
}
if __name__ == "__main__":
myresource = MyResource()
checker = PasswordDictChecker(passwords)
realm = HttpPasswordRealm(myresource)
p = portal.Portal(realm, [checker])
credentialFactory = BasicCredentialFactory("McLaren Labs")
protected_resource = HTTPAuthSessionWrapper(p, [credentialFactory])
root = resource.Resource()
root.putChild("example", protected_resource)
site = server.Site(root)
site.protocol = HTTPChannel
reactor.listenTCP(8801, site)
reactor.run()
Link: Twisted11 Basic Auth using Password Dictionary
- Código:
from twisted.cred import portal, checkers, credentials, error as credError
from twisted.internet import defer, reactor
from twisted.web import guard, http, resource, server
from zope.interface import implements
class HttpPasswordRealm(object):
implements(portal.IRealm)
def __init__(self, resource):
self.resource = resource
def requestAvatar(self, avatarId, mind, *interfaces):
if resource.IResource in interfaces:
return (resource.IResource, self.resource, lambda: None)
raise NotImplementedError()
class MyPasswordChecker(object):
implements(checkers.ICredentialsChecker)
credentialInterfaces = (credentials.IUsernamePassword, )
MY_INSECURE_CREDS = {'name': 'pa$$w0rd'}
@defer.inlineCallbacks
def requestAvatarId(self, creds):
pw = self.MY_INSECURE_CREDS.get(creds.username)
pw_match = yield creds.checkPassword(pw)
if pw_match is True:
defer.returnValue(creds.username)
else:
raise credError.UnauthorizedLogin('Incorrect username or password')
class MyPortal(resource.Resource):
isLeaf = True
def render_GET(self, request):
return 'Top secret content'
checker = MyPasswordChecker()
realm = HttpPasswordRealm(MyPortal())
p = portal.Portal(realm, [checker, ])
factory = guard.BasicCredentialFactory('My secret portal')
protected_resource = guard.HTTPAuthSessionWrapper(p, [factory, ])
site = server.Site(protected_resource)
site.protocol = http.HTTPChannel
reactor.listenTCP(8080, site)
reactor.run()
Link: [Twisted-Python] how to implement login form logic with twisted.cred checkers, credentials and portal
OBS: NÃO TENHO CRÉDITO POR NENHUM DOS SCRIPTS NESTE POST
- Poeki
MEMBRO - Mensagens : 53
Data de inscrição : 16/09/2015
Idade : 25
Outros links
Sex Dez 01, 2017 6:11 am
Outros links:
How to return a json response in twisted
Twisted HTTP server example (Precisa de user e pass) mais fácil que o outro
Desculpem a quantidade de respostas mas é para tentar organizar melhor o tópico.
How to return a json response in twisted
Twisted HTTP server example (Precisa de user e pass) mais fácil que o outro
Desculpem a quantidade de respostas mas é para tentar organizar melhor o tópico.
- Daniel Yohan
MEMBRO - Mensagens : 85
Data de inscrição : 03/03/2015
Idade : 26
Re: Game server + "Web server"
Sex Dez 01, 2017 9:24 pm
não é mais fácil fazer um rest full? e através do rest consultar o que você quiser? '-'
- Poeki
MEMBRO - Mensagens : 53
Data de inscrição : 16/09/2015
Idade : 25
Re: Game server + "Web server"
Sex Dez 01, 2017 11:44 pm
Restful para obter todos os dados do servidor de uma só vez ? Se for isso acho que não seria tão bom pq quanto maior a quantidade de dados maior seria o tempo de carregamento além de poder prejudicar o servidor, acredito que vale mais fazer solicitações pequenas como por exemplo carregar os dados de jogador por jogador, e também acredito que facilita um pouco utilizando basicamente o mesmo esquema do servidor porém apenas em outra portaDaniel Yohan escreveu:não é mais fácil fazer um rest full? e através do rest consultar o que você quiser? '-'
Permissões neste sub-fórum
Não podes responder a tópicos
|
|