Ir para baixo
Poeki
Poeki
MEMBRO

MEMBRO
Mensagens : 53
Data de inscrição : 16/09/2015
Idade : 25

Game server + "Web server" Empty 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

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
Poeki
MEMBRO

MEMBRO
Mensagens : 53
Data de inscrição : 16/09/2015
Idade : 25

Game server + "Web server" Empty POST

Sex Dez 01, 2017 4:57 am
Eis aqui o exemplo de um formulário:

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
Poeki
MEMBRO

MEMBRO
Mensagens : 53
Data de inscrição : 16/09/2015
Idade : 25

Game server + "Web server" Empty 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:
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
Poeki
MEMBRO

MEMBRO
Mensagens : 53
Data de inscrição : 16/09/2015
Idade : 25

Game server + "Web server" Empty 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.
Daniel Yohan
Daniel Yohan
MEMBRO

MEMBRO
Mensagens : 85
Data de inscrição : 03/03/2015
Idade : 26

Game server + "Web server" Empty 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
Poeki
MEMBRO

MEMBRO
Mensagens : 53
Data de inscrição : 16/09/2015
Idade : 25

Game server + "Web server" Empty Re: Game server + "Web server"

Sex Dez 01, 2017 11:44 pm
Daniel Yohan escreveu:não é mais fácil fazer um rest full? e através do rest consultar o que você quiser? '-'
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 porta
Conteúdo patrocinado

Game server + "Web server" Empty Re: Game server + "Web server"

Ir para o topo
Permissões neste sub-fórum
Não podes responder a tópicos