server

package
v0.0.0-...-1047d84 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 21, 2019 License: ISC Imports: 27 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var Clients = &ClientMap{usernames: make(map[uint64]*Client), indices: make(map[int]*Client)}

Clients Collection containing all of the active clients, by index and username hash, guarded by a mutex

View Source
var CommandHandlers = make(map[string]func(*Client, []string))

CommandHandlers A map to assign in-game commands to the functions they should execute.

View Source
var Flags struct {
	Verbose   []bool `short:"v" long:"verbose" description:"Display more verbose output"`
	Port      int    `short:"p" long:"port" description:"The port for the server to listen on,"`
	Config    string `short:"c" long:"config" description:"Specify the configuration file to load server settings from" default:"config.toml"`
	UseCipher bool   `short:"e" long:"encryption" description:"Enable command opcode encryption using ISAAC to encrypt packet opcodes."`
}

Flags This is used to interface with the go-flags package from some guy on github.

View Source
var PacketHandlers = make(map[string]handlerFunc)

PacketHandlers A map with descriptive names for the keys, and functions to run for the value.

View Source
var RsaKey *rsa.PrivateKey

RsaKey The RSA key for use in decoding the login packet

Functions

func BroadcastLogin

func BroadcastLogin(player *world.Player, online bool)

BroadcastLogin Broadcasts the login status of player to the whole server.

func DecryptRSABlock

func DecryptRSABlock(payload []byte) []byte

DecryptRSABlock Attempts to decrypt the payload buffer. Returns the decrypted buffer upon success, otherwise returns nil.

func GenerateSessionID

func GenerateSessionID() uint64

GenerateSessionID Generates a new 64-bit long using the systems CSPRNG. For use as a seed with the ISAAC cipher (or similar secure stream cipher) used to encrypt packet data.

func HashPassword

func HashPassword(password string) string

HashPassword Takes a plaintext password as input, returns a hexidecimal string representation of the SHAKE256 hash as output.

func Start

func Start()

Start Listens for and processes new clients connecting to the server. This method blocks while the server is running.

func Stop

func Stop()

Stop This will stop the server instance, if it is running.

func Tick

func Tick()

Tick One game engine 'tick'. This is to handle movement, to synchronize clients, to update movement-related state variables... Runs once per 600ms.

Types

type Client

type Client struct {
	Index int

	Kill chan struct{}
	// contains filtered or unexported fields
}

Client Represents a single connecting client.

func NewClient

func NewClient(socket net.Conn) *Client

NewClient Creates a new instance of a Client, launches goroutines to handle I/O for it, and returns a reference to it.

func (*Client) Destroy

func (c *Client) Destroy()

Destroy Wrapper around Client.destroy to prevent multiple channel closes causing a panic.

func (*Client) HandleLogin

func (c *Client) HandleLogin(reply chan byte)

HandleLogin This method will block until a byte is sent down the reply channel with the login response to send to the client, or if this doesn't occur, it will timeout after 10 seconds.

func (*Client) HandlePacket

func (c *Client) HandlePacket(p *packets.Packet)

HandlePacket Finds the mapped handler function for the specified packet, and calls it with the specified parameters.

func (*Client) HandleRegister

func (c *Client) HandleRegister(reply chan byte)

HandleRegister This method will block until a byte is sent down the reply channel with the registration response to send to the client, or if this doesn't occur, it will timeout after 10 seconds.

func (*Client) IP

func (c *Client) IP() string

IP Parses the players remote IP address and returns it as a go string. TODO: Should I remove this?

func (*Client) Message

func (c *Client) Message(msg string)

Message Builds a new game packet to display a message in the clients chat box with msg as its contents, and queues it in the outgoing packet queue.

func (*Client) Read

func (c *Client) Read(dst []byte) (int, error)

Read Reads data off of the client's socket into 'dst'. Returns length read into dst upon success. Otherwise, returns -1 with a meaningful error message.

func (*Client) ReadPacket

func (c *Client) ReadPacket() (*packets.Packet, error)

ReadPacket Attempts to read and parse the next 3 bytes of incoming data for the 16-bit length and 8-bit opcode of the next packet frame the client is sending us.

func (*Client) ResetUpdateFlags

func (c *Client) ResetUpdateFlags()

ResetUpdateFlags Resets the players movement updating synchronization variables.

func (*Client) SeedOpcodeCipher

func (c *Client) SeedOpcodeCipher(clientSeed uint64, serverSeed uint64) *IsaacStream

SeedOpcodeCipher Initialize the ISAAC+ PRNG for use as a stream cipher for this client.

func (*Client) StartNetworking

func (c *Client) StartNetworking()

StartNetworking Starts up 3 new goroutines; one for reading incoming data from the socket, one for writing outgoing data to the socket, and one for client state updates and parsing plus handling incoming packets. When the clients kill signal is sent through the kill channel, the state update and packet handling goroutine will wait for both the reader and writer goroutines to complete their operations before unregistering the client.

func (*Client) StartReader

func (c *Client) StartReader()

StartReader Starts the clients socket reader goroutine. Takes a waitgroup as an argument to facilitate synchronous destruction.

func (*Client) StartWriter

func (c *Client) StartWriter()

StartWriter Starts the clients socket writer goroutine.

func (*Client) String

func (c *Client) String() string

String Returns a string populated with some of the more identifying fields from the receiver Client.

func (*Client) TeleBubble

func (c *Client) TeleBubble(diffX, diffY int)

TeleBubble Queues a new packet to create a teleport bubble at the given offsets relative to our player.

func (*Client) Teleport

func (c *Client) Teleport(x, y int)

Teleport Moves the client's player to x,y in the game world, and sends a teleport bubble animation packet to all of the view-area clients.

func (*Client) UpdatePlane

func (c *Client) UpdatePlane()

UpdatePlane Updates the client about the plane that its player is on.

func (*Client) UpdatePositions

func (c *Client) UpdatePositions()

UpdatePositions Updates the client about entities in it's view-area (16x16 tiles in the game world surrounding the player). Should be run every game engine tick.

func (*Client) UpdateStat

func (c *Client) UpdateStat(id int)

UpdateStat Builds and queues for sending a new packet containing our players stat information for given skill ID

func (*Client) Write

func (c *Client) Write(b []byte) int

Write Writes data to the client's socket from `b`. Returns the length of the written bytes.

func (*Client) WritePacket

func (c *Client) WritePacket(p packets.Packet)

WritePacket This is a method to send a packet to the client. If this is a bare packet, the packet payload will be written as-is. If this is not a bare packet, the packet will have the first 3 bytes changed to the appropriate values for the client to parse the length and opcode for this packet.

type ClientMap

type ClientMap struct {
	// contains filtered or unexported fields
}

ClientMap A thread-safe concurrent collection type for storing client references.

func (*ClientMap) Broadcast

func (m *ClientMap) Broadcast(action func(*Client))

Broadcast Calls action for every active client in the collection.

func (*ClientMap) ContainsHash

func (m *ClientMap) ContainsHash(hash uint64) bool

ContainsHash Returns true if there is a client mapped to this username hash is in this collection, otherwise returns false.

func (*ClientMap) FromIndex

func (m *ClientMap) FromIndex(index int) (*Client, bool)

FromIndex Returns the client with the index `index` if it exists and true, otherwise returns nil and false.

func (*ClientMap) FromUserHash

func (m *ClientMap) FromUserHash(hash uint64) (*Client, bool)

FromUserHash Returns the client with the base37 username `hash` if it exists and true, otherwise returns nil and false.

func (*ClientMap) NextIndex

func (m *ClientMap) NextIndex() int

NextIndex Returns the lowest available index for the client to be mapped to.

func (*ClientMap) Put

func (m *ClientMap) Put(c *Client)

Put Puts a client into the map.

func (*ClientMap) Remove

func (m *ClientMap) Remove(c *Client)

Remove Removes a client from the map.

func (*ClientMap) Size

func (m *ClientMap) Size() int

Size Returns the size of the active client collection.

type IsaacStream

type IsaacStream struct {
	// contains filtered or unexported fields
}

IsaacStream Container struct for 2 instances of the ISAAC+ CSPRNG, one for incoming data, the other outgoing data.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL