rua

package module
v0.2.3 Latest Latest
Warning

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

Go to latest
Published: Sep 6, 2021 License: MIT Imports: 7 Imported by: 7

README

Rua!

English README

一个简单的、高度可定制化的游戏服务器框架,基于Go语言编写。

architecture

特性

安装

安装服务器本体

go get github.com/DiscreteTom/rua

安装插件(以websocket为例)

go get github.com/DiscreteTom/rua/plugin/network/websocket

入门

运行此示例代码需要安装websocket插件

package main

import (
	"github.com/DiscreteTom/rua"
	"github.com/DiscreteTom/rua/plugin/network/websocket"
)

func main() {
	s := rua.NewEventDrivenServer().
		SetHandleKeyboardInterrupt(true).
		OnPeerMsg(func(msg *rua.PeerMsg, s *rua.EventDrivenServer) {
			// broadcast to everyone
			for _, p := range s.GetPeers() {
				go p.Write(msg.Data)
			}
		})

	// start websocket listener, which will generate peer to the game server
	go websocket.NewWebsocketListener(":8080", s).Start()

	// start event driven game server
	s.Start()
}

更多示例

日志

  • rua自身提供了默认的logger,可以使用rua.GetDefaultLogger()来获取它,或者使用rua.SetDefaultLogger来覆盖它
    • 比如使用rua.SetDefaultLogger(rua.NewDefaultLogger().WithLevel(rua.DEBUG))来设置日志等级
  • 您也可以使用您喜欢的logger,比如使用logrus,只要它实现了rua.Logger接口
    • rua.SetDefaultLogger(logrus.New())
  • 您也可以使用rua.NewBasicLoggerrua.NewBasicSimpleLogger这两个helper函数,快速构建自定义的logger

English

Rua is a simple, highly customizable game server framework written with golang.

architecture

Features

Installation

Install the rua server itself:

go get github.com/DiscreteTom/rua

Install plugins (e.g. websocket):

go get github.com/DiscreteTom/rua/plugin/network/websocket

Getting Started

This example requires the websocket plugin.

package main

import (
	"github.com/DiscreteTom/rua"
	"github.com/DiscreteTom/rua/plugin/network/websocket"
)

func main() {
	s := rua.NewEventDrivenServer().
		SetHandleKeyboardInterrupt(true).
		OnPeerMsg(func(msg *rua.PeerMsg, s *rua.EventDrivenServer) {
			// broadcast to everyone
			for _, p := range s.GetPeers() {
				go p.Write(msg.Data)
			}
		})

	// start websocket listener, which will generate peer to the game server
	go websocket.NewWebsocketListener(":8080", s).Start()

	// start event driven game server
	s.Start()
}

More Examples

Logging

  • Rua provide a default logger, you can use rua.GetDefaultLogger to get it, or use rua.SetDefaultLogger to override it.
    • E.g. you can use rua.SetDefaultLogger(rua.NewDefaultLogger().WithLevel(rua.DEBUG)) to set log level.
  • You can also use your favorite logger like logrus as long as it implements the interface rua.Logger.
    • rua.SetDefaultLogger(logrus.New())
  • You can use these two helper function rua.NewBasicLogger & rua.NewBasicSimpleLogger to build your own logger quickly.

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func NewBasicLogger

func NewBasicLogger(l SimpleLogger) *basicLogger

func NewBasicSimpleLogger

func NewBasicSimpleLogger(l SmallestLogger) *basicSimpleLogger

func NewDefaultLogger

func NewDefaultLogger() *basicLogger

func SetDefaultLogger

func SetDefaultLogger(logger Logger)

Types

type BasicPeer

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

func NewBasicPeer

func NewBasicPeer(gs GameServer) *BasicPeer

Create a basic peer. You should call `WithTag`/`OnWrite`/`OnClose`/`OnStart` after this call.

func (*BasicPeer) Close

func (p *BasicPeer) Close() error

func (*BasicPeer) GetGameServer

func (p *BasicPeer) GetGameServer() GameServer

func (*BasicPeer) GetId

func (p *BasicPeer) GetId() int

func (*BasicPeer) GetLogger

func (p *BasicPeer) GetLogger() Logger

func (*BasicPeer) GetTag

func (p *BasicPeer) GetTag() string

func (*BasicPeer) OnClose

func (p *BasicPeer) OnClose(f func(p *BasicPeer) error) *BasicPeer

This hook may be triggered concurrently

func (*BasicPeer) OnStart

func (p *BasicPeer) OnStart(f func(p *BasicPeer)) *BasicPeer

This hook may be triggered concurrently

func (*BasicPeer) OnWrite

func (p *BasicPeer) OnWrite(f func(data []byte, p *BasicPeer) error) *BasicPeer

This hook may be triggered concurrently

func (*BasicPeer) SetId

func (p *BasicPeer) SetId(id int)

func (*BasicPeer) SetLogger

func (p *BasicPeer) SetLogger(l Logger)

func (*BasicPeer) SetTag

func (p *BasicPeer) SetTag(t string)

func (*BasicPeer) Start

func (p *BasicPeer) Start()

Start and wait.

func (*BasicPeer) WithLogger

func (p *BasicPeer) WithLogger(l Logger) *BasicPeer

func (*BasicPeer) WithTag

func (p *BasicPeer) WithTag(t string) *BasicPeer

func (*BasicPeer) Write

func (p *BasicPeer) Write(data []byte) error

Thread safe.

type EventDrivenServer

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

func NewEventDrivenServer

func NewEventDrivenServer() *EventDrivenServer

func (*EventDrivenServer) AddPeer

func (s *EventDrivenServer) AddPeer(p Peer) int

Activate a peer, allocate a peerId and manage the peer's lifecycle.

func (*EventDrivenServer) AfterAddPeer

func (s *EventDrivenServer) AfterAddPeer(f func(newPeer Peer, s *EventDrivenServer)) *EventDrivenServer

Register lifecycle hook. At this time the new peer's id has been allocated, and `peers` contains the new peer. This hook may be triggered concurrently.

func (*EventDrivenServer) AfterRemovePeer

func (s *EventDrivenServer) AfterRemovePeer(f func(targetId int, s *EventDrivenServer)) *EventDrivenServer

Register lifecycle hook. The target peer may not exist. If it exists, it must been closed, and been removed from `peers`. This hook may be triggered concurrently.

func (*EventDrivenServer) AppendPeerMsg

func (s *EventDrivenServer) AppendPeerMsg(peerId int, d []byte)

func (*EventDrivenServer) BeforeAddPeer

func (s *EventDrivenServer) BeforeAddPeer(f func(newPeer Peer, s *EventDrivenServer)) *EventDrivenServer

Register lifecycle hook. At this time the new peer's id has been allocated, but `peers` not contains the new peer. This hook won't be triggered concurrently.

func (*EventDrivenServer) BeforeProcPeerMsg

func (s *EventDrivenServer) BeforeProcPeerMsg(f func(m *PeerMsg, s *EventDrivenServer)) *EventDrivenServer

Register lifecycle hook. You can modify or enrich the peer message before process it. This hook may be triggered concurrently.

func (*EventDrivenServer) BeforeRemovePeer

func (s *EventDrivenServer) BeforeRemovePeer(f func(targetId int, s *EventDrivenServer)) *EventDrivenServer

Register lifecycle hook. The target peer may has been closed. The target peer may not exist. This hook may be triggered concurrently.

func (*EventDrivenServer) GetLogger

func (s *EventDrivenServer) GetLogger() Logger

func (*EventDrivenServer) GetPeer

func (s *EventDrivenServer) GetPeer(id int) Peer

Return a peer or nil

func (*EventDrivenServer) GetPeerCount

func (s *EventDrivenServer) GetPeerCount() int

func (*EventDrivenServer) GetPeers

func (s *EventDrivenServer) GetPeers() map[int]Peer

func (*EventDrivenServer) OnPeerMsg

func (s *EventDrivenServer) OnPeerMsg(f func(m *PeerMsg, s *EventDrivenServer)) *EventDrivenServer

Register lifecycle hook. This hook may be triggered concurrently.

func (*EventDrivenServer) RemovePeer

func (s *EventDrivenServer) RemovePeer(peerId int) (err error)

Close the peer and untrack it. Return err if peer not exist.

func (*EventDrivenServer) SetHandleKeyboardInterrupt

func (s *EventDrivenServer) SetHandleKeyboardInterrupt(enable bool) *EventDrivenServer

func (*EventDrivenServer) Start

func (s *EventDrivenServer) Start() (errs []error)

Return errors from peer.Close() when stop the server.

func (*EventDrivenServer) Stop

func (s *EventDrivenServer) Stop()

func (*EventDrivenServer) WithLogger

func (s *EventDrivenServer) WithLogger(l Logger) *EventDrivenServer

type GameServer

type GameServer interface {
	AddPeer(Peer) int
	RemovePeer(peerId int) error
	GetPeerCount() int
	AppendPeerMsg(peerId int, d []byte)
	Start() []error
	Stop()
}

type LockstepServer

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

func NewLockStepServer

func NewLockStepServer() *LockstepServer

func (*LockstepServer) AddPeer

func (s *LockstepServer) AddPeer(p Peer) int

Activate a peer, allocate a peerId and manage the peer's lifecycle.

func (*LockstepServer) AfterAddPeer

func (s *LockstepServer) AfterAddPeer(f func(newPeer Peer, s *LockstepServer)) *LockstepServer

Register lifecycle hook. At this time the new peer's id has been allocated, and `peers` contains the new peer. This hook may be triggered concurrently.

func (*LockstepServer) AfterRemovePeer

func (s *LockstepServer) AfterRemovePeer(f func(targetId int, s *LockstepServer)) *LockstepServer

Register lifecycle hook. The target peer may not exist. If it exists, it must been closed, and been removed from `peers`. This hook may be triggered concurrently.

func (*LockstepServer) AppendPeerMsg

func (s *LockstepServer) AppendPeerMsg(peerId int, d []byte)

func (*LockstepServer) BeforeAddPeer

func (s *LockstepServer) BeforeAddPeer(f func(newPeer Peer, s *LockstepServer)) *LockstepServer

Register lifecycle hook. At this time the new peer's id has been allocated, but `peers` not contains the new peer. This hook won't be triggered concurrently.

func (*LockstepServer) BeforeProcPeerMsg

func (s *LockstepServer) BeforeProcPeerMsg(f func(m *PeerMsg, s *LockstepServer)) *LockstepServer

Register lifecycle hook. You can modify or enrich the peer message before process it. This hook may be triggered concurrently.

func (*LockstepServer) BeforeRemovePeer

func (s *LockstepServer) BeforeRemovePeer(f func(targetId int, s *LockstepServer)) *LockstepServer

Register lifecycle hook. The target peer may has been closed. The target peer may not exist. This hook may be triggered concurrently.

func (*LockstepServer) GetCurrentStep

func (s *LockstepServer) GetCurrentStep() int

func (*LockstepServer) GetCurrentStepLength

func (s *LockstepServer) GetCurrentStepLength() int

func (*LockstepServer) GetLogger

func (s *LockstepServer) GetLogger() Logger

func (*LockstepServer) GetPeer

func (s *LockstepServer) GetPeer(id int) Peer

Return a peer or nil.

func (*LockstepServer) GetPeerCount

func (s *LockstepServer) GetPeerCount() int

func (*LockstepServer) GetPeers

func (s *LockstepServer) GetPeers() map[int]Peer

func (*LockstepServer) OnPeerMsg

func (s *LockstepServer) OnPeerMsg(f func(m *PeerMsg, s *LockstepServer)) *LockstepServer

Register lifecycle hook. This hook may be triggered concurrently.

func (*LockstepServer) OnStep

func (s *LockstepServer) OnStep(f func(peerMsgs []PeerMsg, s *LockstepServer)) *LockstepServer

Register lifecycle hook. This hook may be triggered concurrently.

func (*LockstepServer) RemovePeer

func (s *LockstepServer) RemovePeer(peerId int) (err error)

Close the peer and untrack it. Return err if peer not exist.

func (*LockstepServer) SetHandleKeyboardInterrupt

func (s *LockstepServer) SetHandleKeyboardInterrupt(enable bool) *LockstepServer

func (*LockstepServer) SetMaxStepLength

func (s *LockstepServer) SetMaxStepLength(maxStepLength int) *LockstepServer

Set the max step length and ensure the current step length is valid.

func (*LockstepServer) SetMinStepLength

func (s *LockstepServer) SetMinStepLength(minStepLength int) *LockstepServer

Set the min step length and ensure the current step length is valid.

func (*LockstepServer) SetStepLength

func (s *LockstepServer) SetStepLength(stepLength int) *LockstepServer

Set the current step length. The step length won't be higher than `maxStepLength` and lower than `minStepLength`.

func (*LockstepServer) Start

func (s *LockstepServer) Start() (errs []error)

Return errors from peer.Close() when stop the server.

func (*LockstepServer) Stop

func (s *LockstepServer) Stop()

func (*LockstepServer) WithLogger

func (s *LockstepServer) WithLogger(l Logger) *LockstepServer

type LogLevel

type LogLevel int
const (
	TRACE LogLevel = iota
	DEBUG
	INFO
	WARN
	ERROR
	FATAL
	PANIC
)

type Logger

type Logger interface {
	Trace(v ...interface{})
	Debug(v ...interface{})
	Info(v ...interface{})
	Warn(v ...interface{})
	Error(v ...interface{})
	Fatal(v ...interface{})
	Panic(v ...interface{})
	Tracef(format string, v ...interface{})
	Debugf(format string, v ...interface{})
	Infof(format string, v ...interface{})
	Warnf(format string, v ...interface{})
	Errorf(format string, v ...interface{})
	Fatalf(format string, v ...interface{})
	Panicf(format string, v ...interface{})
}

You can use `NewBasicLogger` to create a Logger.

func GetDefaultLogger

func GetDefaultLogger() Logger

Get the existing or create a new default logger.

type Peer

type Peer interface {
	Write([]byte) error
	Close() error
	Start() // start and wait
	SetId(int)
	GetId() int
	SetTag(string)
	GetTag() string
}

type PeerMsg

type PeerMsg struct {
	PeerId int
	Data   []byte
	Time   time.Time
}

type SimpleLogger

type SimpleLogger interface {
	Trace(v ...interface{})
	Debug(v ...interface{})
	Info(v ...interface{})
	Warn(v ...interface{})
	Error(v ...interface{})
	Fatal(v ...interface{})
	Panic(v ...interface{})
}

You can use `NewBasicSimpleLogger` to create a SimpleLogger.

type SmallestLogger

type SmallestLogger interface {
	Print(v ...interface{})
}

Directories

Path Synopsis
example
peers
plugin
network/kcp Module

Jump to

Keyboard shortcuts

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