11 func NewRequest() (req *JobRequest) {
17 const messageBuffer = 10
19 var newJob = make(chan *JobRequest, messageBuffer)
20 var rqTask = make(chan *TaskRequest, messageBuffer)
21 var playerIdle = make(chan *ClientInfo, messageBuffer)
22 var playerDead = make(chan *ClientInfo, messageBuffer)
23 var statusRequest = make(chan(chan *QueueInformation))
25 func PlayerWaitingForJob(player *ClientInfo) {
29 func PlayerDied(player *ClientInfo) {
33 func DispatchTask(task *TaskRequest) {
37 type QueueInformation struct {
42 func DispatchStatus() (waitingTasks int, waitingPlayers []string) {
43 r := make(chan *QueueInformation)
48 return s.waitingTasks, s.idlePlayers
52 go masterDispatch(); // go!
55 func QueueJob(job *JobRequest) {
56 /* first, allocate the Job it's ID */
57 job.Id = NextRequestId()
58 /* first up, split the job up into it's tasks. */
59 job.Tasks = job.MakeTasks()
60 /* add it to the registry */
62 /* an enqueue all of the tasks */
63 for i := range job.Tasks {
64 DispatchTask(job.Tasks[i])
68 func masterDispatch() {
74 case player := <-playerIdle:
75 o.Debug("Dispatch: Player")
76 /* first, scan to see if we have anything for this player */
81 /* Append this player to the waiting players queue */
85 t,_ := i.Value.(*TaskRequest)
86 if t.IsTarget(player.Player) {
87 /* Found a valid job. Send it to the player, and remove it from our pending
95 case player := <-playerDead:
96 o.Debug("Dispatch: Dead Player")
97 for i := pq.Front(); i != nil; i = i.Next() {
98 p, _ := i.Value.(*ClientInfo)
99 if player.Player == p.Player {
104 case task := <-rqTask:
105 o.Debug("Dispatch: Task")
106 /* first, scan to see if we have valid pending player for this task */
110 /* Out of players! */
111 /* Append this task to the waiting tasks queue */
115 p,_ := i.Value.(*ClientInfo)
116 if task.IsTarget(p.Player) {
124 case respChan := <-statusRequest:
126 response := new(QueueInformation)
127 response.waitingTasks = tq.Len()
129 response.idlePlayers = make([]string, pqLen)
132 for i := pq.Front(); i != nil; i = i.Next() {
133 player,_ := i.Value.(*ClientInfo)
134 response.idlePlayers[idx] = player.Player