테스트

aion-server 4.8

Gitteol
최고관리자 · 1 · 💬 0 클론/새로받기
 4.8 61f661d · 1 commits 새로받기(Pull)
chat-server/src/com/aionemu/chatserver/service/ChatService.java
package com.aionemu.chatserver.service;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.aionemu.chatserver.model.ChatClient;
import com.aionemu.chatserver.model.Race;
import com.aionemu.chatserver.model.channel.Channel;
import com.aionemu.chatserver.model.channel.ChatChannels;
import com.aionemu.chatserver.network.aion.serverpackets.SM_CHANNEL_RESPONSE;
import com.aionemu.chatserver.network.aion.serverpackets.SM_PLAYER_AUTH_RESPONSE;
import com.aionemu.chatserver.network.netty.handler.ClientChannelHandler;
import com.aionemu.chatserver.network.netty.handler.ClientChannelHandler.ClientChannelHandlerState;
import com.aionemu.commons.utils.Rnd;

/**
 * @author ATracer
 */
public class ChatService {

	private static final Logger log = LoggerFactory.getLogger(ChatService.class);
	private static final ChatService instance = new ChatService();
	private final Map<Integer, ChatClient> players = new ConcurrentHashMap<>();

	private ChatService() {

	}

	public static ChatService getInstance() {
		return instance;
	}

	public ChatClient registerPlayer(int playerId, String accName, String nick, Race race, byte accessLevel) throws NoSuchAlgorithmException {
		MessageDigest md = MessageDigest.getInstance("SHA-256");
		md.reset();
		md.update(accName.getBytes(StandardCharsets.UTF_8), 0, accName.length());
		byte[] accountToken = md.digest();
		byte[] token = generateToken(accountToken);
		ChatClient chatClient = new ChatClient(playerId, token, accName, nick, race, accessLevel);
		players.put(playerId, chatClient);
		return chatClient;
	}

	private byte[] generateToken(byte[] accountToken) {
		byte[] dynamicToken = new byte[16];
		Rnd.nextBytes(dynamicToken);
		byte[] token = new byte[48];
		for (int i = 0; i < token.length; i++) {
			if (i < 16)
				token[i] = dynamicToken[i];
			else
				token[i] = accountToken[i - 16];
		}
		return token;
	}

	public void registerPlayerConnection(int playerId, byte[] token, byte[] identifier, String name, String accName,
		ClientChannelHandler channelHandler) {
		ChatClient chatClient = players.get(playerId);
		if (chatClient == null)
			log.warn("Client tried to connect but was not yet registered from game server side");
		else if (!Arrays.equals(chatClient.getToken(), token))
			log.warn("Client tried to connect but given token doesn't match");
		else if (!chatClient.getAccountName().equalsIgnoreCase(accName)) // client sends accName lowercase
			log.warn("Client tried to connect with account name: {} (expected: {})", accName, chatClient.getAccountName());
		else if (!chatClient.getName().equals(name))
			log.warn("Client tried to connect with character name: {} (expected: {})", name, chatClient.getName());
		else {
			chatClient.setIdentifier(identifier);
			chatClient.setChannelHandler(channelHandler);
			channelHandler.sendPacket(new SM_PLAYER_AUTH_RESPONSE());
			channelHandler.setState(ClientChannelHandlerState.AUTHED);
			channelHandler.setChatClient(chatClient);
			BroadcastService.getInstance().addClient(chatClient);
		}
	}

	public void registerPlayerWithChannel(ClientChannelHandler clientChannelHandler, int channelRequestId, String identifier) {
		Channel channel = ChatChannels.getOrCreate(clientChannelHandler.getChatClient(), identifier);
		if (channel != null) {
			clientChannelHandler.getChatClient().addChannel(channel);
			clientChannelHandler.sendPacket(new SM_CHANNEL_RESPONSE(channel, channelRequestId));
		}
	}

	public void playerLogout(int playerId) {
		ChatClient chatClient = players.remove(playerId);
		if (chatClient != null) {
			BroadcastService.getInstance().removeClient(chatClient);
			log.info("Player[id={}] logged out ", playerId);
			if (chatClient.getChannelHandler() != null)
				chatClient.getChannelHandler().close();
			else
				log.warn("Received logout event without client authentication for player {}", playerId);
		}
	}

	public void gagPlayer(int playerId, long gagTimeMillis) {
		ChatClient client = players.get(playerId);
		if (client != null) {
			client.setGagTime(gagTimeMillis);
			log.info("Player[id={}] was gagged for {} minutes", playerId, gagTimeMillis / 60000);
		}
	}
}

📎 첨부파일

댓글 작성 권한이 없습니다.
🏆 포인트 랭킹 TOP 10
순위 닉네임 포인트
1 no_profile 타키야겐지쪽지보내기 자기소개 아이디로 검색 전체게시물 102,949
2 no_profile 동가리쪽지보내기 자기소개 아이디로 검색 전체게시물 63,733
3 no_profile 라프텔쪽지보내기 자기소개 아이디로 검색 전체게시물 51,771
4 no_profile 불멸의행복쪽지보내기 자기소개 아이디로 검색 전체게시물 36,923
5 서번트쪽지보내기 자기소개 아이디로 검색 전체게시물 35,011
6 no_profile 닥터스쪽지보내기 자기소개 아이디로 검색 전체게시물 29,470
7 no_profile 검은고양이쪽지보내기 자기소개 아이디로 검색 전체게시물 29,077
8 no_profile Revolution쪽지보내기 자기소개 아이디로 검색 전체게시물 28,199
9 no_profile 보거스쪽지보내기 자기소개 아이디로 검색 전체게시물 26,731
10 no_profile 호롤롤로쪽지보내기 자기소개 아이디로 검색 전체게시물 17,020
알림 0