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 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 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 stringStringMap = jedis2.hgetAll(playKey); List 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 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 keys = jedis0.smembers("{user}:" + randomKeyFromList + "_token"); List 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 stringStringMap = jedis2.hgetAll(playKey); List 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 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 keys = jedis0.smembers("{user}:" + randomKeyFromList + "_token"); List 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 playRoomMap) { Jedis jedis2 = Redis.use("group1_db2").getJedis(); Jedis jedis11 = Redis.use("group1_db11").getJedis(); Jedis jedis0 = Redis.use().getJedis(); // 按玩法ID排序处理 List> sortedPlays = playRoomMap.entrySet().stream() .sorted(Map.Entry.comparingByKey()) .collect(Collectors.toList()); for (Map.Entry entry : sortedPlays) { String playId = entry.getKey(); int requiredRooms = entry.getValue(); if (requiredRooms <= 0) { System.out.println("玩法 " + playId + ": 跳过创建 (需求数=" + requiredRooms + ")"); continue; } boolean isPlaying = true; //获取所有房间 Set 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 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 stringStringMap = jedis2.hgetAll(keys); List 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 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 keys2 = jedis0.smembers("{user}:" + randomKeyFromList + "_token"); List 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 hashData = jedis.hgetAll(key); for (Map.Entry entry : hashData.entrySet()) { if ("1".equals(entry.getValue())) { count++; System.out.println("找到字段: " + entry.getKey() + " = " + entry.getValue()); } } return count; } //获取所有机器人 public List getAvailableRobots1() { Jedis jedis2 = Redis.use("group1_db2").getJedis(); Set allRobotKeys = jedis2.keys("{robot}:*"); List availableRobots = new ArrayList<>(); // 使用Pipeline提高效率 Pipeline pipeline = jedis2.pipelined(); List> 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 getKeysWithValueZero(Map robotData) { List result = new ArrayList<>(); for (Map.Entry entry : robotData.entrySet()) { if ("0".equals(entry.getValue())) { result.add(entry.getKey()); } } return result; } //随机分配机器人 public String getRandomKeyFromList(List 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() { @Override public void action(MessageResponse messageResponse) { } }); return null; } }