import Foundation import WebSocketKit class Player { let name: PlayerName var socket: WebSocket? var playedCard: Card? var isNextActor: Bool var cards: [Card] var numberOfDoubles: Int var leadsGame: Bool var points: Int? init(name: PlayerName, socket: WebSocket? = nil) { self.name = name self.socket = socket self.cards = [] self.isNextActor = false self.playedCard = nil self.numberOfDoubles = 0 self.leadsGame = false self.points = nil } init(player: Player) { self.name = player.name self.socket = player.socket self.cards = player.cards self.isNextActor = false self.playedCard = player.playedCard self.numberOfDoubles = player.numberOfDoubles self.leadsGame = player.leadsGame self.points = player.points } var actions: [PlayerAction] { [] } } extension Player: Equatable { static func == (lhs: Player, rhs: Player) -> Bool { lhs.name == rhs.name } } extension Player { // MARK: Connection /// Indicate that the player is connected when at a table var isConnected: Bool { guard let socket = socket else { return false } guard !socket.isClosed else { self.socket = nil return false } return true } func connect(using socket: WebSocket) { _ = self.socket?.close() self.socket = socket } @discardableResult func disconnect() -> Bool { guard let socket = socket else { return false } do { try socket.close().wait() } catch { print("Failed to close socket for player: \(name): \(error)") } self.socket = nil return true } @discardableResult func send(_ info: TableInfo) -> Bool { guard let socket = socket else { return false } do { try socket.send(encodeJSON(info)) } catch { print("Failed to send info: \(error)") return false } return true } // MARK: Actions func canPerform(_ action: PlayerAction) -> Bool { actions.contains(action) } } extension Player: CustomStringConvertible { var description: String { name } }