package process
import (
"char_room/common/message"
"char_room/server/model"
"char_room/server/utils"
"encoding/json"
"fmt"
"net"
)
type UserProcess struct {
Conn net.Conn
//增加一个字段表示该conn是哪个用户
UserId int
}
//通知所有用户在线
//userid通知其它的在线用户,我上线
func (this *UserProcess) NotifyOtheronlineUser(userId int) {
//遍历onlineUsers,然后一个一个的发送
for id, up := range userMgr.onlineUsers {
//过滤到自己
if id == userId {
continue
}
//开始通知
up.NotifyMeOnline(userId)
}
}
func (this *UserProcess) NotifyMeOnline(userId int) {
//组装NotifyUserStatusMes
var mes message.Message
mes.Type = message.NotifyUserStatusMesType
var notifyUserStatusMes message.NotifyUserStatusMes
notifyUserStatusMes.UserId = userId
notifyUserStatusMes.Status = message.UserOnline
//将notifyUserStatusMes序列化
data, err := json.Marshal(notifyUserStatusMes)
if err != nil {
fmt.Println("json marshal err=", err)
return
}
//将序列化后的notifyUserStatusMes赋值给mes.data
mes.Data = string(data)
data, err = json.Marshal(mes)
if err != nil {
fmt.Println("json marshal err=", err)
return
}
//发送,创建我们TransFer实例
tf := &utils.Transfer{
Conn: this.Conn,
Buf: [8096]byte{},
}
err = tf.WritePkg(data)
if err != nil {
fmt.Println("NotifyMeOnline err=", err)
return
}
}
func (this *UserProcess) ServerProcessRegister(mes *message.Message) (err error) {
//1.先从mes中取出mes.data,并直接反序列化成RegisterMes
var registerMes message.RegisterMes
err = json.Unmarshal([]byte(mes.Data), ®isterMes)
if err != nil {
fmt.Println("json.Unmarshal fail err=", err)
return
}
//1.先声明一个resMes
var resMes message.Message
resMes.Type = message.RegisterResMesType
//2.再声明一个registerResMes,并完成赋值
var registerResMes message.RegisterResMes
//需要到redis数据库完成注册
//1.使用model.MyUserDao 到redis验证
err = model.MyUserDao.Register(®isterMes.User)
if err != nil {
if err == model.ERROR_USER_EXISTS {
registerResMes.Code = 505
registerResMes.Error = model.ERROR_USER_EXISTS.Error()
} else {
registerResMes.Code = 506
registerResMes.Error = "注册发生未知错误..."
}
} else {
registerResMes.Code = 200
}
data, err := json.Marshal(registerResMes)
if err != nil {
fmt.Println("json.Marshal fail", err)
return
}
//4.将data赋值给resMes
resMes.Data = string(data)
//5.对resMes进行序列化,准备发送
data, err = json.Marshal(resMes)
if err != nil {
fmt.Println("json.Marshal fail", err)
return
}
//6.发送data,我们将其封装到writePkg函数
//因为使用分层模式(mvc),我们先创建一个Transfer实例,然后读取
tf := &utils.Transfer{
Conn: this.Conn,
Buf: [8096]byte{},
}
err = tf.WritePkg(data)
return
}
func (this *UserProcess) ServerProcessLogin(mes *message.Message) (err error) {
//1.先从mes中取出mes.data,并直接反序列化成LoginMes
var loginMes message.LoginMes
err = json.Unmarshal([]byte(mes.Data), &loginMes)
if err != nil {
fmt.Println("json.Unmarshal fail err=", err)
return
}
//1.先声明一个resMes
var resMes message.Message
resMes.Type = message.LoginResMesType
//2.再声明一个LoginResMes,并完成赋值
var loginResMes message.LoginResMes
//需要到redis数据库完成验证
//1.使用model.MyUserDao 到redis验证
user, err := model.MyUserDao.Login(loginMes.UserId, loginMes.UserPwd)
if err != nil {
if err == model.ERROR_USER_NOEXISTS {
loginResMes.Code = 500
loginResMes.Error = err.Error()
} else if err == model.ERROR_USER_PWD {
loginResMes.Code = 403
loginResMes.Error = err.Error()
} else {
loginResMes.Code = 505
loginResMes.Error = "服务器内部错误!"
}
} else {
loginResMes.Code = 200
//这里因为用户登录成功,因此可以把该登录成功的用户放入到userMgr中
//将登陆成功的userid赋给this
this.UserId = loginMes.UserId
userMgr.AddonlineUser(this)
this.NotifyOtheronlineUser(loginMes.UserId)
//将当前用户在线的id放入到loginResMes.UsersId
//遍历userMgr.onlineUsers
for id, _ := range userMgr.onlineUsers {
loginResMes.UserIds = append(loginResMes.UserIds, id)
}
fmt.Println(user, "登录成功")
}
////如果用户id=100,密码=123456,认为合法,否则不合法
//if loginMes.UserId==100&&loginMes.UserPwd=="123456" {
// //合法
// loginResMes.Code = 200
//}else {
// //不合法
// loginResMes.Code = 500 //500状态码表示用户不存在
// loginResMes.Error="饿货!用户不存在!请注册再使用..."
//}
//3.将loginResMes序列化
data, err := json.Marshal(loginResMes)
if err != nil {
fmt.Println("json.marshal fail", err)
return
}
//4.将data赋值给resMes
resMes.Data = string(data)
//5.对resMes进行序列化,准备发送
data, err = json.Marshal(resMes)
if err != nil {
fmt.Println("json.Marshal fail", err)
return
}
//6.发送data,我们将其封装到writePkg函数
//因为使用分层模式(mvc),我们先创建一个Transfer实例,然后读取
tf := &utils.Transfer{
Conn: this.Conn,
Buf: [8096]byte{},
}
err = tf.WritePkg(data)
return
}