Files
youlegames/codes/games/sales_service/server/channel/mod.js
2026-02-04 23:47:45 +08:00

239 lines
5.6 KiB
JavaScript

///////////////////////////////////////////////////
////////////////////// 通道管理 ///////////////////
///////////////////////////////////////////////////
var mod_channel = mod_channel || cls_mod.new("mod_channel", "channel", app_server);
//最小通道id
mod_channel.minid = 100000;
//最大通道id
mod_channel.maxid = 999999;
//可用的通道id列表
mod_channel.ids = [];
mod_channel.ids.length = mod_channel.maxid - mod_channel.minid + 1;
for (var i = 0; i < mod_channel.ids.length; i++) {
mod_channel.ids[i] = mod_channel.minid + i;
};
//可用的通道id列表的有效长度
mod_channel.validlen = mod_channel.maxid - mod_channel.minid + 1;
//通道列表
mod_channel.list = [];
mod_channel.list.length = mod_channel.maxid - mod_channel.minid + 1;
mod_channel.test = function(pack){
pack.data = "123456789";
return pack;
}
//创建
mod_channel.create = function(pack){
//在有效通道id列表中随机数组下标
var idx = min_random(0, mod_channel.validlen - 1);
//确定通道id
var id = mod_channel.ids[idx];
//将有效数组的最后一个房号移至该位置
if (idx < mod_channel.validlen - 1) {
mod_channel.ids[idx] = mod_channel.ids[mod_channel.validlen - 1];
};
mod_channel.ids[mod_channel.validlen - 1] = 0;
//有效数组长度减1
mod_channel.validlen = mod_channel.validlen - 1;
//根据通道id创建通道
var o_channel = {};
o_channel.id = id;
o_channel.plist = []; //谁在通道里面
//添加到通道列表中
mod_channel.list[id - mod_channel.minid] = o_channel;
//返回前端
pack.data = {};
pack.data.channelid = id;
return pack;
}
//释放
mod_channel.free = function(pack){
var channelid = parseInt(pack.data.channelid);
//通道序号
var idx = channelid - mod_channel.minid;
//检查通道id
if (idx < 0 || idx >= mod_channel.list.length) {
pack.data = {};
pack.data.state = 1;
pack.data.error = "通道id不存在";
return pack;
}
if (!mod_channel.list[idx]) {
pack.data = {};
pack.data.state = 1;
pack.data.error = "通道id不存在";
return pack;
}
//释放通道
mod_channel.list[idx] = null;
//释放通道id
mod_channel.ids[mod_channel.validlen] = channelid;
mod_channel.validlen = mod_channel.validlen + 1;
//返回前端
pack.data = {};
pack.data.state = 0;
return pack;
}
//加入
mod_channel.join = function(pack){
var channelid = parseInt(pack.data.channelid);
//通道序号
var idx = channelid - mod_channel.minid;
//检查通道id
if (idx < 0 || idx >= mod_channel.list.length) {
pack.data = {};
pack.data.state = 1;
pack.data.error = "通道id不存在";
return pack;
}
if (!mod_channel.list[idx]) {
pack.data = {};
pack.data.state = 1;
pack.data.error = "通道id不存在";
return pack;
}
o_channel = mod_channel.list[idx];
var p = {};
p.conmode = pack.conmode;
p.fromid = pack.fromid;
o_channel.plist.push(p);
//返回前端
pack.data = {};
pack.data.state = 0;
return pack;
}
//退出
mod_channel.exit = function(pack){
var channelid = parseInt(pack.data.channelid);
//通道序号
var idx = channelid - mod_channel.minid;
//检查通道id
if (idx < 0 || idx >= mod_channel.list.length) {
pack.data = {};
pack.data.state = 1;
pack.data.error = "通道id不存在";
return pack;
}
if (!mod_channel.list[idx]) {
pack.data = {};
pack.data.state = 1;
pack.data.error = "通道id不存在";
return pack;
}
o_channel = mod_channel.list[idx];
for (var i = 0; i < o_channel.plist.length; i++) {
if (o_channel.plist[i]) {
if (o_channel.plist[i].fromid == pack.fromid) {
o_channel.plist[i] = null;
//返回前端
pack.data = {};
pack.data.state = 0;
return pack;
}
}
}
//返回前端
pack.data = {};
pack.data.state = 1;
pack.data.error = "未在通道内";
return pack;
}
//广播
mod_channel.broadcast = function(pack){
var channelid = parseInt(pack.data.channelid);
var content = pack.data.msg;
//通道序号
var idx = channelid - mod_channel.minid;
//检查通道id
if (idx < 0 || idx >= mod_channel.list.length) {
pack.data = {};
pack.data.state = 1;
pack.data.error = "通道id不存在";
return pack;
}
if (!mod_channel.list[idx]) {
pack.data = {};
pack.data.state = 1;
pack.data.error = "通道id不存在";
return pack;
}
o_channel = mod_channel.list[idx];
for (var i = 0; i < o_channel.plist.length; i++) {
if (o_channel.plist[i]) {
//广播前端
var msg = {};
msg.app = pack.app;
msg.route = pack.route;
msg.rpc = pack.rpc;
msg.conmode = o_channel.plist[i].conmode;
msg.fromid = o_channel.plist[i].fromid;
msg.data = {};
msg.data.state = 0;
msg.data.msg = content;
mod_channel.app.SendPack(msg);
}
}
}
//断线
mod_channel.OnTcpDisConnected = function(str_tcpid){
for (var i = 0; i < mod_channel.list.length; i++) {
if (mod_channel.list[i]){
for (var j = 0; j < mod_channel.list[i].plist.length; j++) {
if (mod_channel.list[i].plist[j]) {
if (mod_channel.list[i].plist[j].fromid == str_tcpid) {
//广播前端
var msg = {};
msg.app = mod_channel.app.appname;
msg.route = mod_channel.routename;
msg.rpc = "disconnected";
msg.data = {};
msg.data.channelid = mod_channel.list[i].id;
msg.data.idx = j;
for (var k = 0; k < mod_channel.list[i].plist.length; k++) {
if (k != j){
msg.conmode = mod_channel.list[i].plist[k].conmode;
msg.fromid = mod_channel.list[i].plist[k].fromid;
mod_channel.app.SendPack(msg);
}
}
return;
}
}
}
}
}
}
mod_channel.timer = min_ontime(function(){
mod_channel.ran = min_random(1,100);
}, 2000);