|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bufio"
|
|
|
|
"fmt"
|
|
|
|
"net"
|
|
|
|
"strings"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Connection struct {
|
|
|
|
net.Conn
|
|
|
|
*bufio.Reader
|
|
|
|
player *Player
|
|
|
|
location *System
|
|
|
|
lastScan time.Time
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewConnection(conn net.Conn) *Connection {
|
|
|
|
return &Connection{
|
|
|
|
Conn: conn,
|
|
|
|
Reader: bufio.NewReader(conn),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Connection) Login() {
|
|
|
|
for {
|
|
|
|
fmt.Fprintf(c, "what is your name, adventurer?\n")
|
|
|
|
name, err := c.ReadString('\n')
|
|
|
|
if err == nil {
|
|
|
|
name = strings.TrimSpace(name)
|
|
|
|
} else {
|
|
|
|
log_error("player failed to connect: %v", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if !ValidName(name) {
|
|
|
|
fmt.Fprintf(c, "that name is illegal.\n")
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
log_info("player connected: %v", name)
|
|
|
|
player, err := loadPlayer(name)
|
|
|
|
if err != nil {
|
|
|
|
log_error("could not read player: %v", err)
|
|
|
|
player = &Player{name: name}
|
|
|
|
if err := player.Create(); err != nil {
|
|
|
|
|
|
|
|
}
|
|
|
|
fmt.Fprintf(c, "godspeed, %s.\n", player.name)
|
|
|
|
} else {
|
|
|
|
c.player = player
|
|
|
|
fmt.Fprintf(c, "welcome back, %s.\n", player.name)
|
|
|
|
}
|
|
|
|
break
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Connection) SetSystem(s *System) {
|
|
|
|
c.location = s
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Connection) System() *System {
|
|
|
|
return c.location
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Connection) Close() error {
|
|
|
|
log_info("player disconnecting: %s", c.PlayerName())
|
|
|
|
return c.Conn.Close()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Connection) PlayerName() string {
|
|
|
|
if c.player == nil {
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
return c.player.name
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Connection) InTransit() bool {
|
|
|
|
return c.location == nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Connection) RecordScan() {
|
|
|
|
c.lastScan = time.Now()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Connection) CanScan() bool {
|
|
|
|
return time.Since(c.lastScan) > 1*time.Minute
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Connection) NextScan() time.Duration {
|
|
|
|
return -time.Since(c.lastScan.Add(time.Minute))
|
|
|
|
}
|