tinsert(UISpecialFrames, "CT_RA_SlashCmdFrame");
function CT_RASlashCmd_DisplayDialog()
	table.sort(CT_RA_SlashCmds, function(t1, t2)
		return t1[2] < t2[2]
	end);
	-- Initialize dialog
	local totalHeight = 0;
	for i = 1, 30, 1 do
		local obj = getglobal("CT_RA_SlashCmdFrameScrollFrameCmdsCmd" .. i);
		if ( CT_RA_SlashCmds[i] ) then
			obj.slashCommand = CT_RA_SlashCmds[i][2];
			obj:Show();
			getglobal(obj:GetName() .. "Text"):SetText(CT_RA_SlashCmds[i][2]);
			getglobal(obj:GetName() .. "Description"):SetText(CT_RA_SlashCmds[i][3]);
			if ( strlen(CT_RA_SlashCmds[i][4]) > 0 ) then
				getglobal(obj:GetName() .. "Available"):SetText("사용가능한 다른 명령어: |c00FFFFFF" .. CT_RA_SlashCmds[i][4] .. "|r");
				obj:SetHeight(CT_RA_SlashCmds[i][1]+33);
			else
				getglobal(obj:GetName() .. "Available"):SetText("");
				obj:SetHeight(CT_RA_SlashCmds[i][1]+25);
			end
			getglobal(obj:GetName() .. "Description"):SetHeight(CT_RA_SlashCmds[i][1]);
			totalHeight = totalHeight + CT_RA_SlashCmds[i][1];
		else
			obj:Hide();
		end
		if ( i > 1 ) then
			obj:SetPoint("TOPLEFT", "CT_RA_SlashCmdFrameScrollFrameCmdsCmd" .. (i-1), "BOTTOMLEFT");
		end
	end
	CT_RA_SlashCmdFrameScrollFrameCmds:SetHeight(totalHeight);
	ShowUIPanel(CT_RA_SlashCmdFrame);
	CT_RA_SlashCmdFrameScrollFrame:UpdateScrollChildRect();
	
	local minVal, maxVal = CT_RA_SlashCmdFrameScrollFrameScrollBar:GetMinMaxValues();
	if ( maxVal == 0 ) then
		CT_RA_SlashCmdFrameScrollFrameScrollBar:Hide();
	else
		CT_RA_SlashCmdFrameScrollFrameScrollBar:Show();
	end
end

CT_RA_SlashCmds = { };

function CT_RA_RegisterSlashCmd(title, description, height, identifier, func, ...)
	SlashCmdList[identifier] = func;
	local otherCmds = "";
	for i = 1, select('#', ...), 1 do
		setglobal("SLASH_" .. identifier .. i, (select(i, ...)));
		if ( i > 1 ) then
			if ( strlen(otherCmds) > 0 ) then
				otherCmds = otherCmds .. ", ";
			end
			otherCmds = otherCmds .. (select(i, ...));
		end
	end
	local num = 0;
	while ( string.find(description, "|b.-|eb") ) do
		description = string.gsub(description, "^(.*)|b(.-)|eb(.*)$", "%1|c00FFD100%2|r%3");
		num = num + 1;
		if ( num > 10 ) then
			break;
		end
	end
	tinsert(CT_RA_SlashCmds, { height, title, description, otherCmds });
end


-- Functions used by slash commands
function CT_RA_CheckReady()
	if ( CT_RA_Level >= 1 ) then
		SendChatMessage("<공격대 도우미> " .. UnitName("player") .. " 님께서 준비 완료하셨습니다.", "RAID");
		CT_RA_AddMessage("CHECKREADY");
		local numValid = 0;
		for i = 1, GetNumRaidMembers(), 1 do
			local name, rank, subgroup, level, class, fileName, zone, online, isDead = GetRaidRosterInfo(i);
			if ( name ~= UnitName("player") and CT_RA_Stats[name] and CT_RA_Stats[name]["Reporting"] and online and CT_RA_Stats[name]["Version"] and CT_RA_Stats[name]["Version"] >= 1.097 ) then
				numValid = numValid + 1;
				CT_RA_Stats[name]["notready"] = 1;
			end
		end
		if ( numValid >= 1 ) then
			CT_RA_Print("<공격대 도우미> |c00FFFFFF" .. numValid .. "|r명의 공격대원이 준비되었습니다.", 1, 1, 0);
		end
		CT_RA_UpdateFrame.readyTimer = 30;
		CT_RA_UpdateRaidGroup(0);
	else
		CT_RA_Print("<공격대 도우미> 이 기능을 사용하려면 공격대장 또는 승급자여야 합니다!", 1, 1, 0);
	end
end

function CT_RA_CheckVote(question)
	if ( CT_RA_Level >= 1 ) then
		SendChatMessage("<공격대 도우미> " .. UnitName("player") .. " 님이 투표를 하였습니다: " .. question, "RAID");
		CT_RA_AddMessage("VOTE " .. question);
		CT_RA_Print("<공격대 도우미> 공격대 투표중: |c00FFFFFF" .. question .. "|r", 1, 1, 0);
		CT_RA_UpdateFrame.voteTimer = 30;
	else
		CT_RA_Print("<공격대 도우미> 이 기능을 사용하려면 공격대장 또는 승급자여야 합니다!", 1, 1, 0);
	end
end

function CT_RA_CheckRly()
	if ( CT_RA_Level >= 1 ) then
--~ 		SendChatMessage("<CTRaid> " .. UnitName("player") .. " asks the raid: O RLY?", "RAID");
		CT_RA_AddMessage("CHECKRLY");
		local numValid = 0;
		for i = 1, GetNumRaidMembers(), 1 do
			local name, rank, subgroup, level, class, fileName, zone, online, isDead = GetRaidRosterInfo(i);
			if ( name ~= UnitName("player") and CT_RA_Stats[name] and CT_RA_Stats[name]["Reporting"] and online and CT_RA_Stats[name]["Version"] and CT_RA_Stats[name]["Version"] >= 1.097 ) then
				numValid = numValid + 1;
				CT_RA_Stats[name]["rly"] = 1;
			end
		end
		if ( numValid >= 1 ) then
			CT_RA_Print("<공격대 도우미> |c00FFFFFF" .. numValid .. "|r명의 공대원의 준비 상태를 검사하였습니다.", 1, 1, 0);
		--else
		--	CT_RA_Print("<공격대 도우미> O RLY status is being checked for |c00FFFFFF" .. numValid .. "|r raid members.", 1, 1, 0);
		end
		CT_RA_UpdateFrame.rlyTimer = 30;
		CT_RA_UpdateRaidGroup(0);
	else
		CT_RA_Print("<공격대 도우미> 이 기능을 사용하려면 공격대장 또는 승급자여야 합니다!", 1, 1, 0);
	end
end

function CT_RA_Invite(msg)
	if ( not GetGuildInfo("player") ) then
		CT_RA_Print("<공격대 도우미> 단체 초대 기능을 사용하기 위해선 길드에 속해있어야 합니다.");
		return;
	end
	if ( ( not CT_RA_Level or CT_RA_Level == 0 ) and GetNumRaidMembers() > 0 ) then
		CT_RA_Print("<공격대 도우미> 단체 초대 기능을 사용하려면 공격대장 또는 승급자여야 합니다.", 1, 1, 0);
		return;
	end
	local inZone = "";
	if ( CT_RA_ZoneInvite ) then
		inZone = GetRealZoneText() .. "에 있는";
	end
	local useless, useless, min, max = string.find(msg, "^(%d+)-(%d+)$");
	min = tonumber(min);
	max = tonumber(max);
	if ( min and max ) then
		if ( min > max ) then
			local temp = min;
			min = max;
			max = temp;
		end
		if ( min < 1 ) then min = 1; end
		if ( max > 70 ) then max = 70; end
		if ( min == max ) then
			SendChatMessage("10초후 " .. inZone .. min .. " 레벨의 길드원들에게 공격대 초대를 하겠습니다. 이미 파티에 속해있다면 파탈 해주세요.", "GUILD");
		else
			SendChatMessage("10초후 " .. inZone .. min .. " 부터 " .. max .. " 레벨의 길드원들에게 공격대 초대를 하겠습니다. 이미 파티에 속해있다면 파탈 해주세요.", "GUILD");
		end
		GuildRoster();
		CT_RA_MinLevel = min;
		CT_RA_MaxLevel = max;
		CT_RA_UpdateFrame.startinviting = 10;
	else
		useless, useless, min = string.find(msg, "^(%d+)$");
		min = tonumber(min);
		if ( min ) then
			if ( min < 1 ) then min = 1; end
			if ( min > 70 ) then min = 70; end
			GuildRoster();
			SendChatMessage("10초후 " .. inZone .. min .. " 레벨의 길드원들에게 공격대 초대를 하겠습니다. 이미 파티에 속해있다면 파탈해주세요.", "GUILD");
			CT_RA_MinLevel = min;
			CT_RA_MaxLevel = min;
			CT_RA_UpdateFrame.startinviting = 10;
		else
			if ( CT_RA_ZoneInvite ) then
				CT_RA_Print("<공격대 도우미> 문법 오류. 사용 예: |c00FFFFFF/공격대지역초대 레벨|r 또는 |c00FFFFFF/공격대초대 최소레벨-최대레벨|r.", 1, 0.5, 0);
				CT_RA_Print("<공격대 도우미> 이 명령어는 현재 있는 지역에서 설정한 레벨대의 길드원들을 한꺼번에 초대하는 명령입니다. (만약 최대 레벨수치를 설정하지 않았다면 오직 설정한 레벨의 플레이어만 초대합니다.).", 1, 0.5, 0);
			else
				CT_RA_Print("<공격대 도우미> 문법 오류. 사용 예: |c00FFFFFF/공격대초대 레벨|r 또는 |c00FFFFFF/공격대초대 최소레벨-최대레벨|r.", 1, 0.5, 0);
				CT_RA_Print("<공격대 도우미> 이 명령어는 설정한 레벨대의 길드원들을 한꺼번에 초대하는 명령입니다. (만약 최대 레벨수치를 설정하지 않았다면 오직 설정한 레벨의 플레이어만 초대합니다.).", 1, 0.5, 0);
			end
		end
	end
end

-- Slash commands
	-- /raslash
CT_RA_RegisterSlashCmd("/공대도움말", "이 창을 표시합니다.", 15, "RAHELP", CT_RASlashCmd_DisplayDialog, "/공대도움말");

	-- /rares
CT_RA_RegisterSlashCmd("/공대부활", "|b/공대부활 [표시/숨김]|eb 명령으로 부활 현황 창을 표시하거나 숨깁니다.", 15, "RARES", function(msg)
	if ( msg == "표시" ) then
		if ( GetNumRaidMembers() > 0 ) then
			CT_RA_ResFrame:Show();
		end
		CT_RAMenu_Options["temp"]["ShowMonitor"] = 1;
	elseif ( msg == "숨김" ) then
		CT_RA_ResFrame:Hide();
		CT_RAMenu_Options["temp"]["ShowMonitor"] = nil;
	else
		CT_RA_Print("<공격대 도우미> 사용법: |c00FFFFFF/공대부활 [표시/숨김]|r - 부활 현황 창을 표시하거나 숨깁니다.", 1, 0.5, 0);
	end
end, "/공대부활");

	-- /rs
CT_RA_RegisterSlashCmd("/공메", "|b/공메 [할말]|eb 명령으로 공격대의 모든 공격대도우미 사용자에게 화면 중앙에 메세지를 전송합니다. (|b공대장 또는 승급자 권한을 필요로 합니다|eb).", 30, "RS", function(msg)
	if ( CT_RA_Level >= 1 ) then
		if ( CT_RAMenu_Options["temp"]["SendRARS"] ) then
			SendChatMessage(msg, "RAID");
		end
		CT_RA_AddMessage("MS " .. string.gsub(msg, "%%[tT]", UnitName("target") or TARGET_TOKEN_NOT_FOUND));
	else
		CT_RA_Print("<공격대 도우미> 승급자 또는 공격대장이어야 사용할 수 있습니다!", 1, 1, 0);
	end
end, "/공메", "/rs");

	-- /raupdate
CT_RA_RegisterSlashCmd("/공대갱신", "공격대 상태를 갱신합니다. (|b공격대장 또는 승급자 권한을 필요로 합니다|eb)", 15, "RAUPDATE", function()
	if ( CT_RA_Level >= 1 ) then
		CT_RA_AddMessage("SR");
		CT_RA_Print("<공격대 도우미> 공격대의 상태가 갱신되었습니다.", 1, 0.5, 0);
	else
		CT_RA_Print("<공격대 도우미> 이 기능을 사용하려면 공격대장 또는 승급자여야 합니다!", 1, 0.5, 0);
	end
end, "/공대갱신", "/raupd");

	-- /rakeyword
CT_RA_RegisterSlashCmd("/공대키워드", "귓말로 특정 키워드를 말하면 자동으로 초대하는 기능입니다.", 15, "RAKEYWORD", function(msg)
	if ( msg == "오프" ) then
		CT_RAMenu_Options["temp"]["KeyWord"] = nil;
		CT_RA_Print("<공격대 도우미> 키워드 초대 기능을 사용하지 않습니다.", 1, 0.5, 0);
	elseif ( msg == "" ) then
		local kw = CT_RAMenu_Options["temp"]["KeyWord"];
		if ( kw ) then
			CT_RA_Print("<공격대 도우미> 초대 키워드: '|c00FFFFFF" .. kw .. "|r'입니다. |c00FFFFFF/공대키워드 오프|r 명령어로 키워드 초대 기능을 끌 수 있습니다.", 1, 0.5, 0);
		else
			CT_RA_Print("<공격대 도우미> 초대 키워드가 설정되지 않았습니다.", 1, 0.5, 0);
		end
	else
		CT_RAMenu_Options["temp"]["KeyWord"] = msg;
		CT_RA_Print("<공격대 도우미> 자동 초대에 쓰일 키워드가 '|c00FFFFFF" .. msg .. "|r'|1으로;로; 설정되었습니다. |c00FFFFFF/공격대키워드 오프|r 명령으로 키워드 초대 기능을 끌 수 있습니다.", 1, 0.5, 0);
	end
end, "/공대키워드", "/rakw");

	-- /radisband
CT_RA_RegisterSlashCmd("/공대해산", "공격대를 해산합니다. (|b공격대장 또는 승급자 권한을 필요로 합니다|eb)", 15, "RADISBAND", function(msg)
	if ( CT_RA_Level and CT_RA_Level >= 1 ) then
		CT_RA_Print("<공격대 도우미> 공격대를 해산합니다...", 1, 0.5, 0);
		SendChatMessage("<공격대 도우미> " .. UnitName("player") .. "님의 요청에 의해 공격대를 해산합니다.", "RAID");
		for i = 1, GetNumRaidMembers(), 1 do
			local name, rank, subgroup, level, class, fileName, zone, online, isDead = GetRaidRosterInfo(i);
			if ( online and rank <= CT_RA_Level and name ~= UnitName("player") ) then
				UninviteUnit(name);
			end
		end
		CT_RA_AddMessage("DB");
		LeaveParty();
	else
		CT_RA_Print("<공격대 도우미> 이 기능을 사용하려면 공격대장 또는 승급자여야 합니다!", 1, 0.5, 0);
	end
end, "/공대해산");

	-- /rashow
CT_RA_RegisterSlashCmd("/공대창표시", "|b/공대창표시|eb 또는 |b/공대창표시 전부|eb 명령으로, 파티창을 숨기거나 모두 표시합니다.", 15, "RASHOW", function(msg)
	if ( msg == "전부" ) then
		CT_RAMenu_Options["temp"]["ShowGroups"] = { 1, 1, 1, 1, 1, 1, 1, 1 };
		CT_RACheckAllGroups:SetChecked(1);
		for i = 1, 8, 1 do
			getglobal("CT_RAOptionsGroupCB" .. i):SetChecked(1);
		end
	else
		if ( not CT_RAMenu_Options["temp"]["HiddenGroups"] ) then return; end
		CT_RAMenu_Options["temp"]["ShowGroups"] = CT_RAMenu_Options["temp"]["HiddenGroups"];
		CT_RAMenu_Options["temp"]["HiddenGroups"] = nil;
		local num = 0;
		for k, v in pairs(CT_RAMenu_Options["temp"]["ShowGroups"]) do
			num = num + 1;
			getglobal("CT_RAOptionsGroupCB" .. k):SetChecked(1);
		end
		if ( num > 0 ) then
			CT_RACheckAllGroups:SetChecked(1);
		else
			CT_RACheckAllGroups:SetChecked(nil);
		end
	end
	CT_RA_UpdateRaidGroup(0);
end, "/공대창표시");

	-- /rahide
CT_RA_RegisterSlashCmd("/공대창숨김", "모든 파티창을 숨깁니다.", 15, "RAHIDE", function()
	CT_RAMenu_Options["temp"]["HiddenGroups"] = CT_RAMenu_Options["temp"]["ShowGroups"];
	CT_RAMenu_Options["temp"]["ShowGroups"] = { };
	CT_RACheckAllGroups:SetChecked(nil);
	for i = 1, 8, 1 do
		getglobal("CT_RAOptionsGroupCB" .. i):SetChecked(nil);
	end
	CT_RA_UpdateRaidGroup(0);
end, "/공대창숨김");

	-- /raoptions
CT_RA_RegisterSlashCmd("/공대설정", "설정창을 표시합니다.", 20, "RAOPTIONS", function(msg)
	CT_RAMenuFrame:Show();
end, "/공대설정");

	-- /raready
CT_RA_RegisterSlashCmd("/공대준비", "준비 상태를 점검합니다, 모든 공격대 도우미 사용자에게 준비상태를 물어봅니다. (|b공대장 또는 승급자 권한을 필요로 합니다|eb)", 30, "RAREADY", CT_RA_CheckReady, "/공대준비", "/rar");

	-- /ravote
CT_RA_RegisterSlashCmd("/공대투표", "사용법: |b/공대투표 [설문]|eb - 투표를 실시합니다, 공격대에 설문을 하여 의견을 물어볼 수 있습니다. 결과는 30초 후 공격대 챗에 알려집니다.", 30, "RAVOTE", CT_RA_CheckVote, "/공대투표");

	-- /rarly
CT_RA_RegisterSlashCmd("/공대응답", "응답 체크를 합니다, 모든 공격대 도우미 사용자에게 응답을 물어봅니다. (|b승급자 또는 공격대장 권한을 필요로 합니다|eb).", 30, "RARLY", CT_RA_CheckRly, "/공대응답", "/rly");

	-- /rainvite
CT_RA_RegisterSlashCmd("/공대초대", "|b/공대초대 최소레벨-최고레벨|eb 또는 |b/공대초대 레벨|eb 명령으로 길드내의 선택된 레벨대의 모든 길드원을 초대합니다.", 30, "RAINVITE", function(msg)
	CT_RA_ZoneInvite = nil;
	CT_RA_Invite(msg);
end, "/공대초대", "/rainv");

	-- /razinvite
CT_RA_RegisterSlashCmd("/공대지역초대", "|b/공대지역초대 최소레벨-최고레벨|eb 또는 |b/공대지역초대 레벨|eb 명령으로 자신과 같은존에 있는 길드내의 선택된 레벨대의 모든 길드원을 초대합니다.", 30, "RAZINVITE", function(msg)
	CT_RA_ZoneInvite = 1;
	CT_RA_Invite(msg);
end, "/공대지역초대", "/razinv");

	-- /radur
CT_RA_RegisterSlashCmd("/공대내구도", "모든 공격대 도우미 사용자의 내구도를 검사합니다. (|b공대장 또는 승급자 권한을 필요로 합니다|eb)", 30, "RADUR", function()
	if ( CT_RA_Level >= 1 ) then
		CT_RADurability_Shown = { };
		CT_RADurability_Sorting = {
			["curr"] = 4,
			[3] = { "a", "a" },
			[4] = { "a", "a" }
		};
		CT_RA_DurabilityFrame.type = "RADUR";
		CT_RA_DurabilityFrame.arg = nil;
		CT_RADurability_Update();
		ShowUIPanel(CT_RA_DurabilityFrame);
		CT_RA_DurabilityFrameValueTab:SetText("내구도 백분율");
		CT_RA_DurabilityFrameValueTab:Show();
		for i = 1, 5, 1 do
			getglobal("CT_RA_DurabilityFrameResistTab" .. i):Hide();
		end
		CT_RA_DurabilityFrameTitle:SetText("내구도 검사");
		CT_RA_AddMessage("DURC");
	else
		CT_RA_Print("<공격대 도우미> 이 기능을 사용하기 위해선 공격대장 또는 승급자여야 합니다!", 1, 0.5, 0);
	end
end, "/공대내구도");

	-- /rareg
CT_RA_RegisterSlashCmd("/공대재료", "모든 공격대 도우미 사용자에게서 버프에 필요한 재료를 검사합니다. (|b공대장 또는 승급자 권한을 필요로 합니다|eb)", 30, "RAREG", function()
	if ( CT_RA_Level >= 1 ) then
		CT_RADurability_Shown = { };
		CT_RADurability_Sorting = {
			["curr"] = 3,
			[3] = { "a", "a" },
			[4] = { "a", "a" }
		};
		CT_RA_DurabilityFrame.type = "RAREG";
		CT_RA_DurabilityFrame.arg = nil;
		CT_RA_DurabilityFrameValueTab:SetText("재료 갯수");
		CT_RA_DurabilityFrameValueTab:Show();
		for i = 1, 5, 1 do
			getglobal("CT_RA_DurabilityFrameResistTab" .. i):Hide();
		end
		CT_RADurability_Update();
		ShowUIPanel(CT_RA_DurabilityFrame);
		CT_RA_DurabilityFrameTitle:SetText("재료 검사");
		CT_RA_AddMessage("REAC");
	else
		CT_RA_Print("<공격대 도우미> 이 기능을 사용하기 위해선 공격대장 또는 승급자여야 합니다!", 1, 0.5, 0);
	end
end, "/공대재료");


	-- /raitem
CT_RA_RegisterSlashCmd("/공대아이템", "|b/공대아이템 아이템이름|eb 또는 |b/공대아이템 [아이템 이름]|eb; 명령을 통해 쉬프트+클릭으로 링크하여 공대에 보여줄 수 있습니다. (|b/공대아이템 물의 정기|eb 등의 명령을 통해 화심을 준비중인 공대에 유용하게 사용이 가능합니다)", 60, "RAITEM", function(itemName)
	if ( CT_RA_Level >= 1 ) then
		if ( not itemName ) then
			CT_RA_Print("<공격대 도우미> 사용법: |c00FFFFFF/공대아이템 아이템 이름|r  알림: 아이템 링크로도 사용할 수 있습니다.", 1, 0.5, 0);
			return;
		end
		local _, _, linkName = string.find(itemName, "%[(.+)%]");
		if ( linkName ) then
			itemName = linkName;
		end
		CT_RADurability_Shown = { };
		CT_RADurability_Sorting = {
			["curr"] = 4,
			[3] = { "a", "a" },
			[4] = { "a", "a" }
		};
		CT_RA_DurabilityFrame.type = "RAITEM";
		CT_RA_DurabilityFrame.arg = itemName;
		CT_RA_DurabilityFrameValueTab:SetText("아이템 갯수");
		CT_RA_DurabilityFrameValueTab:Show();
		for i = 1, 5, 1 do
			getglobal("CT_RA_DurabilityFrameResistTab" .. i):Hide();
		end
		CT_RADurability_Update();
		ShowUIPanel(CT_RA_DurabilityFrame);
		CT_RA_DurabilityFrameTitle:SetText("아이템 검사");
		CT_RA_AddMessage("ITMC " .. itemName);
	else
		CT_RA_Print("<공격대 도우미> 이 기능을 사용하기 위해선 공격대장 또는 승급자여야 합니다!", 1, 0.5, 0);
	end
end, "/공대아이템");

	-- /raversion
CT_RA_RegisterSlashCmd("/공대버전", " 모든 공대원의 공격대 도우미 버전을 검사합니다.", 15, "RAVERSION", function()
		CT_RADurability_Shown = { };
		CT_RADurability_Sorting = {
			["curr"] = 4,
			[3] = { "a", "b" },
			[4] = { "a", "b" }
		};
		CT_RA_DurabilityFrame.type = "RAVERSION";
		CT_RA_DurabilityFrameValueTab:SetText("버전");
		CT_RA_DurabilityFrameValueTab:Show();
		for i = 1, 5, 1 do
			getglobal("CT_RA_DurabilityFrameResistTab" .. i):Hide();
		end
		CT_RADurability_Update();
		ShowUIPanel(CT_RA_DurabilityFrame);
		CT_RA_DurabilityFrameTitle:SetText("버전 검사");
		for i = 1, GetNumRaidMembers(), 1 do
			local name = UnitName("raid" .. i);
			if ( CT_RA_Stats[name] and CT_RA_Stats[name]["Version"] ) then
				local name, rank, subgroup, level, class, fileName = GetRaidRosterInfo(i);
				CT_RADurability_Add(name, CT_RA_Stats[name]["Version"], fileName, CT_RA_Stats[name]["Version"]);
			else
				local name, rank, subgroup, level, class, fileName = GetRaidRosterInfo(i);
				CT_RADurability_Add(name, "|c00666666공격대 도우미 없음|r", fileName, 0);
			end
		end
end, "/공대버전", "/raver");

	-- /raresist (Thanks Sudo!)
CT_RA_RegisterSlashCmd("/공대저항력", "모든 공격대 도우미 사용자에게서 저항력을 검사합니다. (|b공대장 또는 승급자 권한을 필요로 합니다|eb)", 30, "RARST", function(msg)
	if ( CT_RA_Level >= 1 ) then
		CT_RADurability_Shown = { };
		CT_RADurability_Sorting = {
			["curr"] = 3,
			[3] = { "a", "a" },
			[4] = { "b", "b" },
			[5] = { "b", "b" },
			[6] = { "b", "b" },
			[7] = { "b", "b" },
			[8] = { "b", "b" },
		};
		
		CT_RA_DurabilityFrame.type = "RARST";
		CT_RA_DurabilityFrameValueTab:Hide();
		for i = 1, 5, 1 do
			getglobal("CT_RA_DurabilityFrameResistTab" .. i):Show();
		end
		CT_RADurability_Update();
		ShowUIPanel(CT_RA_DurabilityFrame);
		CT_RA_DurabilityFrameTitle:SetText("저항력 검사");
		CT_RA_AddMessage("RSTC");
	else
		CT_RA_Print("<공격대 도우미> 이 기능을 사용하기 위해선 공격대장 또는 승급자여야 합니다!", 1, 0.5, 0);
	end
end, "/공대저항력", "/raresists");

	-- /razone
CT_RA_RegisterSlashCmd("/공대지역", "모든 공격대 도우미 사용자에게서 자신과 다른곳에 있는지를 검사합니다. (|b공대장 또는 승급자 권한을 필요로 합니다|eb)", 30, "RAZONE", function(msg)
	CT_RADurability_Shown = { };
	CT_RADurability_Sorting = {
		["curr"] = 3,
		[3] = { "a", "a" },
		[4] = { "a", "a" }
	};
	CT_RA_DurabilityFrame.type = "RAZONE";
	CT_RA_DurabilityFrameValueTab:Show();
	for i = 1, 5, 1 do
		getglobal("CT_RA_DurabilityFrameResistTab" .. i):Hide();
	end
	CT_RADurability_Update();
	ShowUIPanel(CT_RA_DurabilityFrame);
	CT_RA_DurabilityFrameTitle:SetText("지역 검사");
	CT_RA_DurabilityFrameValueTab:SetText("지역 이름");
	
	local name, rank, subgroup, level, class, fileName, zone;
	for i = 1, GetNumRaidMembers(), 1 do
		name, rank, subgroup, level, class, fileName, zone = GetRaidRosterInfo(i);
		if ( name ~= UnitName("player") and zone and zone ~= "" and zone ~= "오프라인" and zone ~= GetRealZoneText() ) then
			CT_RADurability_Add(name, zone, fileName);
		end
	end
end, "/공대지역");

	-- /raquiet (by Angarth)
CT_RA_RegisterSlashCmd("/공대정숙", "공격대장이 이야기 할 동안 공격대의 대화를 중단시킵니다. (|b공격대장 또는 승급자 권한을 필요로 합니다|eb).", 15, "RASQUELCH", function()
	if ( CT_RA_Level >= 1 ) then
		if ( CT_RA_Squelch > 0 ) then
			SendChatMessage("<공격대 도우미> 정숙 모드가 해제되었습니다.", "RAID");
			CT_RA_Print("<공격대 도우미> 정숙 모드가 해제되었습니다.", 1, 0.5, 0);
			CT_RA_Squelch = 0;
		else
			SendChatMessage("<공격대 도우미> 정숙 모드입니다. 이야기 할 수 없습니다.", "RAID");
			CT_RA_Print("<공격대 도우미> 정숙 모드가 작동했습니다.", 1, 0.5, 0);
			CT_RA_Squelch = 5*60;
		end
	else
		CT_RA_Print("<공격대 도우미> 이 기능을 사용하기 위해선 공격대장 또는 승급자여야 합니다!", 1, 0.5, 0);
	end
end, "/공대정숙", "/rasquelch");

	-- /ratab
CT_RA_RegisterSlashCmd("/공대탭", "CT공격대 탭을 표시합니다.", 15, "RATAB", function()
	ShowUIPanel(CT_RATabFrame);
end, "/공대탭");

oldSendChatMessage = SendChatMessage;
function SendChatMessage(msg, type, language, target)
		if ( type == "RAID" ) then
			if ( CT_RA_Squelch > 0 and CT_RA_Level < 1 ) then
				CT_RA_Print("<공격대 도우미> 지금은 공격대 채널에서 이야기 할 수 없습니다. (정숙 모드가 작동했습니다).", 1, 0.5, 0);
				return;
			end
		end
		oldSendChatMessage(msg, type, language, target);
end