|  | @@ -0,0 +1,81 @@
 | 
											
												
													
														|  | 
 |  | +package protocol
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +import (
 | 
											
												
													
														|  | 
 |  | +	"sync"
 | 
											
												
													
														|  | 
 |  | +	"time"
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	"github.com/v2ray/v2ray-core/common/dice"
 | 
											
												
													
														|  | 
 |  | +	v2net "github.com/v2ray/v2ray-core/common/net"
 | 
											
												
													
														|  | 
 |  | +)
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +type ServerSpec struct {
 | 
											
												
													
														|  | 
 |  | +	sync.RWMutex
 | 
											
												
													
														|  | 
 |  | +	Destination v2net.Destination
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	users []*User
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +func NewServerSpec(dest v2net.Destination, users ...*User) *ServerSpec {
 | 
											
												
													
														|  | 
 |  | +	return &ServerSpec{
 | 
											
												
													
														|  | 
 |  | +		Destination: dest,
 | 
											
												
													
														|  | 
 |  | +		users:       users,
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +func (this *ServerSpec) HasUser(user *User) bool {
 | 
											
												
													
														|  | 
 |  | +	this.RLock()
 | 
											
												
													
														|  | 
 |  | +	defer this.RUnlock()
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	account := user.Account
 | 
											
												
													
														|  | 
 |  | +	for _, u := range this.users {
 | 
											
												
													
														|  | 
 |  | +		if u.Account.Equals(account) {
 | 
											
												
													
														|  | 
 |  | +			return true
 | 
											
												
													
														|  | 
 |  | +		}
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +	return false
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +func (this *ServerSpec) AddUser(user *User) {
 | 
											
												
													
														|  | 
 |  | +	if this.HasUser(user) {
 | 
											
												
													
														|  | 
 |  | +		return
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	this.Lock()
 | 
											
												
													
														|  | 
 |  | +	defer this.Unlock()
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	this.users = append(this.users, user)
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +func (this *ServerSpec) PickUser() *User {
 | 
											
												
													
														|  | 
 |  | +	userCount := len(this.users)
 | 
											
												
													
														|  | 
 |  | +	return this.users[dice.Roll(userCount)]
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +func (this *ServerSpec) IsValid() bool {
 | 
											
												
													
														|  | 
 |  | +	return true
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +func (this *ServerSpec) SetValid(b bool) {
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +type TimeoutServerSpec struct {
 | 
											
												
													
														|  | 
 |  | +	*ServerSpec
 | 
											
												
													
														|  | 
 |  | +	until time.Time
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +func NewTimeoutServerSpec(spec *ServerSpec, until time.Time) *TimeoutServerSpec {
 | 
											
												
													
														|  | 
 |  | +	return &TimeoutServerSpec{
 | 
											
												
													
														|  | 
 |  | +		ServerSpec: spec,
 | 
											
												
													
														|  | 
 |  | +		until:      until,
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +func (this *TimeoutServerSpec) IsValid() bool {
 | 
											
												
													
														|  | 
 |  | +	return this.until.Before(time.Now())
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +func (this *TimeoutServerSpec) SetValid(b bool) {
 | 
											
												
													
														|  | 
 |  | +	if !b {
 | 
											
												
													
														|  | 
 |  | +		this.until = time.Time{}
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +}
 |