fengyeserver/libs/robot_common/src/main/java/taurus/newRobot/jiqiren.java

610 lines
26 KiB
Java

package taurus.newRobot;
import com.taurus.core.entity.ITArray;
import com.taurus.core.entity.ITObject;
import com.taurus.core.entity.TObject;
import com.taurus.core.events.Event;
import com.taurus.core.events.IEventListener;
import com.taurus.core.plugin.redis.Redis;
import com.taurus.core.util.ICallback;
import com.taurus.core.util.StringUtil;
import hunan.HuNanChangSha;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.Response;
import taurus.client.Message;
import taurus.client.MessageResponse;
import taurus.client.SocketCode;
import taurus.client.TaurusClient;
import taurus.client.business.AccountBusiness;
import taurus.client.business.GroupRoomBusiness;
import taurus.util.ChangShaSuanFaTest;
import taurus.util.TinHuChi;
import java.util.*;
import java.util.stream.Collectors;
public class jiqiren {
public String wanfaId = "";
// 会话标识
private String session = "";
// 访问令牌
public String token = "";
// 客户端连接对象
private TaurusClient client = null;
private Map<String, Object> mapclient = new HashMap<>();
public TaurusClient getClient() {
return client;
}
public void setClient(TaurusClient client) {
this.client = client;
}
//进入真人房间
public void tcp_jiqirenzhenren(String id) {
Jedis jedis0 = Redis.use().getJedis();
Jedis jedis11 = Redis.use("group1_db11").getJedis();
Jedis jedis2 = Redis.use("group1_db2").getJedis();
String roomKey = "";
String roomId = id.substring(id.indexOf(":") + 1);
roomKey = "room:" + roomId;
//玩法id
String gpid = jedis0.hget(roomKey, "gpid");
//圈子id
String group = jedis0.hget(roomKey, "group");
//获取玩法对应的机器人 g{330800}:play:10
String playKey = "g{" + group + "}:play:" + gpid;
String players1 = jedis0.hget(roomKey, "players");
if (jedis11.hget(playKey, "leftover_robot") != null) {
//玩法配置的机器人数量
String leftover_robot = jedis11.hget(playKey, "leftover_robot");
//机器人主动找真人
if (players1 != null && !players1.equals("[]")) {
List<String> availableRobots1 = getAvailableRobots1();
String players = jedis0.hget(roomKey, "players");
players = players.substring(1, players.length() - 1);
String[] playerIds1 = players.split(",");
String maxPlayers = jedis0.hget(roomKey, "maxPlayers");
if (Integer.parseInt(maxPlayers) == 2) {
if (playerIds1.length == 1) {
//循环playerIds
for (int i = 0; i < playerIds1.length; i++) {
String playeid = playerIds1[i];
if (!availableRobots1.contains(playeid) && Integer.parseInt(leftover_robot) > 0) {
Map<String, String> stringStringMap = jedis2.hgetAll(playKey);
List<String> zeroValueKeys = getKeysWithValueZero(stringStringMap);
System.out.println("值为0的机器人ID: " + zeroValueKeys);
String randomKeyFromList = getRandomKeyFromList(zeroValueKeys);
System.out.println("随机给的用户id----" + randomKeyFromList);
wanfaId = jedis0.hget(roomKey, "game");
if ("22".equalsIgnoreCase(wanfaId)) { //湖南红中麻将
//client = new TaurusClient("8.138.242.190:6421", "game", TaurusClient.ConnectionProtocol.Tcp);
}
if ("10".equalsIgnoreCase(wanfaId)) {
client = new TaurusClient("127.0.0.1:6311", "game", TaurusClient.ConnectionProtocol.Tcp);
//TaurusClient client1=getClient();
client.connect();
mapclient.put(randomKeyFromList, client);
}
if ("66".equalsIgnoreCase(wanfaId)) {
// client = new TaurusClient("8.138.242.190:6841", "game", TaurusClient.ConnectionProtocol.Tcp);
}
ITObject object = null;
AccountBusiness accountBusiness = null;
accountBusiness = new AccountBusiness();
// 登录获取session跟token
if (jedis0.keys("{user}:" + randomKeyFromList + "_token").size() != 0) {
Set<String> keys1 = jedis0.keys("{user}:" + randomKeyFromList + "_token");
if (keys1 == null) {
try {
object = accountBusiness.idPasswordLogin(Integer.parseInt(randomKeyFromList), "123456");
} catch (Exception e) {
e.printStackTrace();
}
ITObject validate = TObject.newInstance();
validate.putString("token", object.getString("token"));
token = object.getString("token");
session = accountBusiness.getSession();
} else {
Set<String> keys = jedis0.smembers("{user}:" + randomKeyFromList + "_token");
List<String> keyList = new ArrayList<>(keys);
session = "{user}:" + randomKeyFromList;
token = keyList.get(0);
}
} else {
try {
object = accountBusiness.idPasswordLogin(Integer.parseInt(randomKeyFromList), "123456");
} catch (Exception e) {
e.printStackTrace();
}
ITObject validate = TObject.newInstance();
validate.putString("token", object.getString("token"));
token = object.getString("token");
session = accountBusiness.getSession();
}
String roomKey1 = "room:" + roomId;
try {
ITObject roomInfos = GroupRoomBusiness.joinRoom(Integer.parseInt(group), roomKey1, session, null);
} catch (Exception e) {
e.printStackTrace();
}
joinRoom(Integer.parseInt(randomKeyFromList)); //进入房间
jedis2.hset(playKey, randomKeyFromList, "1");
String robortInfoKey = "{robortInfo}:" + randomKeyFromList;
jedis2.hset(robortInfoKey, "circleId", group);
jedis2.hset(robortInfoKey, "pid", gpid);
jedis2.hset(robortInfoKey, "room_id", roomId);
ready(); //准备
jedis11.hincrBy(playKey, "leftover_robot", -1);
lianjiejiqiren lianjiejiqiren = new lianjiejiqiren();
lianjiejiqiren.token = token;
lianjiejiqiren.session = session;
lianjiejiqiren.lianjie(client, wanfaId, mapclient);
}
}
}
}
}
}
System.out.println(roomKey);
}
//进入中括号的房间
public void tcp_jiqirezhongkouhao(String id) {
Jedis jedis0 = Redis.use().getJedis();
Jedis jedis11 = Redis.use("group1_db11").getJedis();
Jedis jedis2 = Redis.use("group1_db2").getJedis();
String roomKey = "";
String roomId = id.substring(id.indexOf(":") + 1);
roomKey = "room:" + roomId;
//玩法id
String gpid = jedis0.hget(roomKey, "gpid");
//圈子id
String group = jedis0.hget(roomKey, "group");
//获取玩法对应的机器人 g{330800}:play:10
String playKey = "g{" + group + "}:play:" + gpid;
String players1 = jedis0.hget(roomKey, "players");
if (jedis11.hget(playKey, "leftover_robot") != null && players1 != null) {
//玩法配置的机器人数量
String leftover_robot = jedis11.hget(playKey, "leftover_robot");
//机器人进入退出的房间
if (players1.equals("[]")) {
String maxPlayers = jedis0.hget(roomKey, "maxPlayers");
if (Integer.parseInt(maxPlayers) == 2) {
if (Integer.parseInt(leftover_robot) > 0) {
int count = countValuesEqualToOne(jedis2, playKey);
System.out.println("count 数量 +++++++++++++++++++++" + count);
if (count < 2) {
Map<String, String> stringStringMap = jedis2.hgetAll(playKey);
List<String> zeroValueKeys = getKeysWithValueZero(stringStringMap);
System.out.println("值为0的机器人ID: " + zeroValueKeys);
String randomKeyFromList = getRandomKeyFromList(zeroValueKeys);
System.out.println("随机给的用户id----" + randomKeyFromList);
wanfaId = jedis0.hget(roomKey, "game");
if ("22".equalsIgnoreCase(wanfaId)) { //湖南红中麻将
// client = new TaurusClient("8.138.242.190:6421", "game", TaurusClient.ConnectionProtocol.Tcp);
}
if ("10".equalsIgnoreCase(wanfaId)) {
client = new TaurusClient("127.0.0.1:6311", "game", TaurusClient.ConnectionProtocol.Tcp);
client.connect();
mapclient.put(randomKeyFromList, client);
}
if ("66".equalsIgnoreCase(wanfaId)) {
// client = new TaurusClient("8.138.242.190:6841", "game", TaurusClient.ConnectionProtocol.Tcp);
}
ITObject object = null;
AccountBusiness accountBusiness = null;
accountBusiness = new AccountBusiness();
// 登录获取session跟token
if (jedis0.keys("{user}:" + randomKeyFromList + "_token").size() != 0) {
Set<String> keys1 = jedis0.keys("{user}:" + randomKeyFromList + "_token");
if (keys1 == null) {
try {
object = accountBusiness.idPasswordLogin(Integer.parseInt(randomKeyFromList), "123456");
} catch (Exception e) {
e.printStackTrace();
}
ITObject validate = TObject.newInstance();
validate.putString("token", object.getString("token"));
token = object.getString("token");
session = accountBusiness.getSession();
} else {
Set<String> keys = jedis0.smembers("{user}:" + randomKeyFromList + "_token");
List<String> keyList = new ArrayList<>(keys);
session = "{user}:" + randomKeyFromList;
token = keyList.get(0);
}
} else {
try {
object = accountBusiness.idPasswordLogin(Integer.parseInt(randomKeyFromList), "123456");
} catch (Exception e) {
e.printStackTrace();
}
ITObject validate = TObject.newInstance();
validate.putString("token", object.getString("token"));
token = object.getString("token");
session = accountBusiness.getSession();
}
String roomKey1 = "room:" + roomId;
try {
ITObject roomInfos = GroupRoomBusiness.joinRoom(Integer.parseInt(group), roomKey1, session, null);
} catch (Exception e) {
e.printStackTrace();
}
joinRoom(Integer.parseInt(randomKeyFromList)); //进入房间
jedis2.hset(playKey, randomKeyFromList, "1");
String robortInfoKey = "{robortInfo}:" + randomKeyFromList;
jedis2.hset(robortInfoKey, "circleId", group);
jedis2.hset(robortInfoKey, "pid", gpid);
jedis2.hset(robortInfoKey, "room_id", roomId);
ready(); //准备
jedis11.hincrBy(playKey, "leftover_robot", -1);
lianjiejiqiren lianjiejiqiren = new lianjiejiqiren();
lianjiejiqiren.token = token;
lianjiejiqiren.session = session;
lianjiejiqiren.lianjie(client, wanfaId, mapclient);
}
}
}
}
}
jedis0.close();
jedis2.close();
jedis11.close();
}
//创建房间,进入房间
public void createRoomsForCircle(String circleId, Map<String, Integer> playRoomMap) {
Jedis jedis2 = Redis.use("group1_db2").getJedis();
Jedis jedis11 = Redis.use("group1_db11").getJedis();
Jedis jedis0 = Redis.use().getJedis();
// 按玩法ID排序处理
List<Map.Entry<String, Integer>> sortedPlays = playRoomMap.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.collect(Collectors.toList());
for (Map.Entry<String, Integer> entry : sortedPlays) {
String playId = entry.getKey();
int requiredRooms = entry.getValue();
if (requiredRooms <= 0) {
System.out.println("玩法 " + playId + ": 跳过创建 (需求数=" + requiredRooms + ")");
continue;
}
boolean isPlaying = true;
//获取所有房间
Set<String> roomIds = jedis0.keys("room:*");
for (String id : roomIds) {
String roomId = id.substring(id.indexOf(":") + 1);
String roomKey = "room:" + roomId;
String players = jedis0.hget(roomKey, "players");
if (players != null) {
if (players.equals("[]")) {
isPlaying = false;
}
}
}
System.out.println("玩法 " + playId + ": 创建 " + requiredRooms + " 个房间");
List<Object> roomsForPlay = new ArrayList<>();
for (int i = 1; i <= requiredRooms; i++) {
try {
String keys = "g{" + circleId + "}:play:" + playId;
if (jedis11.hget(keys, "leftover_robot") != null && isPlaying) {
String leftover_robot = jedis11.hget(keys, "leftover_robot");
if (Integer.parseInt(leftover_robot) > 0) {
Map<String, String> stringStringMap = jedis2.hgetAll(keys);
List<String> zeroValueKeys = getKeysWithValueZero(stringStringMap);
System.out.println("值为0的机器人ID: " + zeroValueKeys);
String randomKeyFromList = getRandomKeyFromList(zeroValueKeys);
System.out.println("随机给的用户id----" + randomKeyFromList);
jedis2.hset(keys, randomKeyFromList, "1");
ITObject object = null;
AccountBusiness accountBusiness = null;
accountBusiness = new AccountBusiness();
// 登录获取session跟token
if (jedis0.keys("{user}:" + randomKeyFromList + "_token").size() != 0) {
Set<String> keys1 = jedis0.keys("{user}:" + randomKeyFromList + "_token");
if (keys1 == null) {
object = accountBusiness.idPasswordLogin(Integer.parseInt(randomKeyFromList), "123456");
ITObject validate = TObject.newInstance();
validate.putString("token", object.getString("token"));
token = object.getString("token");
session = accountBusiness.getSession();
} else {
Set<String> keys2 = jedis0.smembers("{user}:" + randomKeyFromList + "_token");
List<String> keyList = new ArrayList<>(keys2);
session = "{user}:" + randomKeyFromList;
token = keyList.get(0);
}
} else {
object = accountBusiness.idPasswordLogin(Integer.parseInt(randomKeyFromList), "123456");
ITObject validate = TObject.newInstance();
validate.putString("token", object.getString("token"));
token = object.getString("token");
session = accountBusiness.getSession();
}
// 调用原有的房间匹配逻辑
Object room = GroupRoomBusiness.matchRoom(Integer.parseInt(circleId), Integer.parseInt(playId), session, "Android", false);
String game = jedis0.hget(String.valueOf(room), "game");
wanfaId = String.valueOf(game);
String roomKey = String.valueOf(room);
System.out.println("roomkey--------" + roomKey);
client = null;
System.out.println("wanfaId" + wanfaId);
if ("22".equalsIgnoreCase(wanfaId)) { //湖南红中麻将
client = new TaurusClient("8.138.242.190:6421", "game", TaurusClient.ConnectionProtocol.Tcp);
}
if ("10".equalsIgnoreCase(wanfaId)) {
client = new TaurusClient("127.0.0.1:6311", "game", TaurusClient.ConnectionProtocol.Tcp);
// client.setSession(session);
client.connect();
mapclient.put(randomKeyFromList, client);
}
System.out.println("clinet 111 " + client);
if ("66".equalsIgnoreCase(wanfaId)) {
client = new TaurusClient("8.138.242.190:6841", "game", TaurusClient.ConnectionProtocol.Tcp);
}
System.out.println("id ++++++" + mapclient);
System.out.println("mapclient----" + mapclient);
ITObject roomInfos = GroupRoomBusiness.joinRoom(Integer.parseInt(circleId), roomKey, this.session, null);
String roomId = roomInfos.getString("room_id");
String robort = "{robortInfo}:" + randomKeyFromList;
jedis2.hset(robort, "room_id", roomId);
jedis2.hset(robort, "circleId", circleId);
jedis2.hset(robort, "pid", playId);
joinRoom(Integer.parseInt(randomKeyFromList)); //进入房间
String playKey1 = "g{" + circleId + "}:play:" + playId;
jedis11.hincrBy(playKey1, "leftover_robot", -1);
lianjiejiqiren lianjiejiqiren = new lianjiejiqiren();
lianjiejiqiren.token = token;
lianjiejiqiren.session = session;
lianjiejiqiren.lianjie(client, wanfaId, mapclient);
ready(); //准备
if (room != null) {
roomsForPlay.add(room);
System.out.println(" 第 " + i + " 个房间创建成功");
} else {
System.out.println(" 第 " + i + " 个房间创建失败");
}
}
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.err.println("创建过程被中断");
break;
} catch (Exception e) {
System.err.println("创建房间时出错: " + e.getMessage());
}
}
jedis2.close();
jedis11.close();
jedis0.close();
}
}
/**
* 统计Hash中值为"1"的字段数量
*/
public static int countValuesEqualToOne(Jedis jedis, String key) {
int count = 0;
Map<String, String> hashData = jedis.hgetAll(key);
for (Map.Entry<String, String> entry : hashData.entrySet()) {
if ("1".equals(entry.getValue())) {
count++;
System.out.println("找到字段: " + entry.getKey() + " = " + entry.getValue());
}
}
return count;
}
//获取所有机器人
public List<String> getAvailableRobots1() {
Jedis jedis2 = Redis.use("group1_db2").getJedis();
Set<String> allRobotKeys = jedis2.keys("{robot}:*");
List<String> availableRobots = new ArrayList<>();
// 使用Pipeline提高效率
Pipeline pipeline = jedis2.pipelined();
List<Response<String>> responses = new ArrayList<>();
for (String robotKey : allRobotKeys) {
responses.add(pipeline.hget(robotKey, "start"));
}
pipeline.sync();
// 提取机器人ID并筛选
int index = 0;
for (String robotKey : allRobotKeys) {
String startStatus = responses.get(index).get();
String robotId = robotKey.substring(robotKey.indexOf(":") + 1);
availableRobots.add(robotId);
index++;
}
jedis2.close();
return availableRobots;
}
//获取状态为0的机器人
public static List<String> getKeysWithValueZero(Map<String, String> robotData) {
List<String> result = new ArrayList<>();
for (Map.Entry<String, String> entry : robotData.entrySet()) {
if ("0".equals(entry.getValue())) {
result.add(entry.getKey());
}
}
return result;
}
//随机分配机器人
public String getRandomKeyFromList(List<String> zeroValueKeys) {
if (zeroValueKeys == null || zeroValueKeys.isEmpty()) {
return null;
}
Random random = new Random();
int randomIndex = random.nextInt(zeroValueKeys.size());
return zeroValueKeys.get(randomIndex);
}
//监听
/**
* 加入房间方法
*
* @return
*/
public String joinRoom(int playerId) {
try {
// 添加2秒延迟
Thread.sleep(5000);
ITObject params = TObject.newInstance();
params.putString("session", session + "," + token);
client.send("1002", params, response -> {
ITObject obj = response.messageData.param.getTObject("tableInfo");
});
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
/**
* 线程休眠方法
*
* @param time 休眠时间(毫秒)
*/
public static void sleepTime(int time) {
try {
// 添加延迟
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 准备方法
*
* @return
*/
public String ready() {
try {
// 添加1秒延迟
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ITObject params = TObject.newInstance();
params.putString("session", session + "," + token);
client.send("1003", params, new ICallback<MessageResponse>() {
@Override
public void action(MessageResponse messageResponse) {
}
});
return null;
}
}