sspanel按月結算,修改go版代碼【mysql api】

開頭感謝sspanel的作者orvice大神!轉載請註明】

博主最近在搭建sspanel v3,中間坑確實挺多的,我回頭開貼補充一下,ss服務器端我選擇了orvice的shadowsocks-go mu版,因爲作者是基於流量控制的機理,實際上奸商都是通過時間控制(233),所以我就尋思在作者的基礎上加以修改,添加時間的限制。

注:此版本基於mysqlapi,webapi的修改方式令開貼

我在sspanel數據的user表中添加了兩個字段:end_time int,到期日期(1970開始的時間戳);package_type int 套餐類型(無,月,三個月,半年,一年)。


具體可以根據自己實際需要情況修改。

首先,我們找到用戶控制代碼,在shadowsocks-go-mu\mu\mysql\mysql.go中,作者在這裏用struct讀取mysql中的數據

type User struct {
	id             int
	port           int
	passwd         string
	method         string
	enable         int
	transferEnable int
	u              int
	d              int
}

需要在裏面加上我們新加的三個字段(因爲我不知道go語言如何獲取時間戳,所以直接從sql讀了,有一個好處是如果配置多個服務器,可以保持時間同步,不受本地時間 )

	end_time        int
	//從mysql讀取服務器當前時間戳
	now_time        int
	package_type   int

找到讀取數據庫數據的方法,給上述字段賦值

func (c *Client) GetUsers() ([]user.User, error) {
	log.Log.Info("get mysql users")
	var datas []*User
	//查詢數據庫加上新增的字段
	rows, err := c.db.Model(User{}).Select("id, passwd, port, method,enable,transfer_enable,u,d,end_time,UNIX_TIMESTAMP(LOCALTIME()) as now_time,package_type").Rows()
	if err != nil {
		log.Log.Error(err)
		var users []user.User
		return users, err
	}
	defer rows.Close()
	for rows.Next() {
		var data User
		//將讀取到的到期時間和賬戶類型賦值
		err := rows.Scan(&data.id, &data.passwd, &data.port, &data.method, &data.enable, &data.transferEnable, &data.u, &data.d, &data.end_time, &data.now_time, &data.package_type)
		if err != nil {
			log.Log.Error(err)
			continue
		}
		datas = append(datas, &data)
	}
	log.Log.Info(len(datas))
	users := make([]user.User, len(datas))
	for k, v := range datas {
		users[k] = v
	}
	return users, nil
}

下一步,找到控制方法,增加到期自動斷開

func (u *User) IsEnable() bool {
	if u.enable == 0 {
		return false
	}
	if u.u+u.d > u.transferEnable {
		return false
	}
	//如果過期,停用用戶
	if u.now_time > u.end_time {
		return false
	}
	return true
}


以上,改完之後重新編譯,替換掉原有的mu文件,將服務端重新啓動即可


有疑問的可以加羣討論,羣號256950656


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章