Advertisement
Guest User

chatrom

a guest
May 22nd, 2016
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.79 KB | None | 0 0
  1. #include "stdafx.h"
  2.  
  3. enum Chatroomopcodes
  4. {
  5. CHATROOM_LIST = 0x04,
  6. CHATROOM_CREATE = 0x05,
  7. CHATROOM_JOIN = 0x06,
  8. CHATROOM_LEAVE = 0x07,
  9. CHATROOM_SEARCH = 0x08,
  10. CHATROOM_UPDATECONFIG = 0x09,
  11. CHATROOM_MEMBEROPTION = 0x0B,
  12. CHATROOM_ADMIN = 0x0C,
  13.  
  14. CHATROOM_MANUEL = 0x0B
  15. };
  16.  
  17. void CUser::ChatRoomHandle(Packet & pkt )
  18. {
  19. uint8 chatroomManuel = pkt.read<uint8>();
  20.  
  21. if(chatroomManuel != CHATROOM_MANUEL)
  22. return;
  23.  
  24. uint8 opcode = pkt.read<uint8>();
  25.  
  26. switch(opcode)
  27. {
  28. case CHATROOM_LIST:
  29. ChatRoomList(pkt);
  30. break;
  31. case CHATROOM_CREATE:
  32. ChatRoomCreate(pkt);
  33. break;
  34. case CHATROOM_JOIN:
  35. ChatRoomJoin(pkt);
  36. break;
  37. case CHATROOM_LEAVE:
  38. ChatroomLeave(pkt);
  39. break;
  40. case CHATROOM_ADMIN:
  41. ChatroomAdmin(pkt);
  42. break;
  43. case CHATROOM_MEMBEROPTION:
  44. ChatroomMemberoption(pkt);
  45. break;
  46. default:
  47. printf("Chatroom Handle Unknow : %d\n",opcode);
  48. break;
  49. }
  50. }
  51.  
  52. void CUser::ChatRoomList(Packet & pkt)
  53. {
  54. Packet result(WIZ_NATION_CHAT,uint8(0x0B));
  55.  
  56. uint16 count = 0;
  57. result << uint8(CHATROOM_LIST) << uint16(count);
  58. result.DByte();
  59. //190B04 01 0002 00 0500 726573756C 00 01 00 0100 0A00
  60. foreach_stlmap(itr, g_pMain->m_ChatRoomArray)
  61. {
  62. _CHAT_ROOM* pChatRoom = itr->second;
  63.  
  64. if(pChatRoom == nullptr)
  65. continue;
  66.  
  67. result << uint16(++count)
  68. << pChatRoom->strRoomName
  69. << uint8(pChatRoom->isPassword())
  70. << pChatRoom->m_bRoomNation
  71. << uint8(0)
  72. << pChatRoom->m_sCurrentUser
  73. << pChatRoom->m_sMaxUser;
  74. }
  75.  
  76. result.put(2,count);
  77.  
  78. Send(&result);
  79. }
  80.  
  81. void CUser::ChatRoomCreate(Packet & pkt )
  82. {
  83. if(m_ChatRoomIndex < 1 )
  84. return;
  85.  
  86. Packet result(WIZ_NATION_CHAT,uint8(0x0B));
  87.  
  88. uint8 isPassword,unk,m_bResult;
  89. uint16 RoomSize;
  90. std::string strRoomName , strPassword;
  91.  
  92. strPassword.empty();
  93.  
  94. pkt.DByte();
  95. pkt >> strRoomName >> isPassword ;
  96.  
  97. m_bResult = 0;
  98.  
  99. if(isPassword != 0)
  100. pkt >> strPassword;
  101. else
  102. pkt >> unk;
  103.  
  104. pkt >> RoomSize;
  105.  
  106. _CHAT_ROOM* m_pRoom = new _CHAT_ROOM();
  107.  
  108. m_pRoom->strRoomName = strRoomName;
  109. m_pRoom->m_bRoomNation = GetNation();
  110. m_pRoom->strAdministrator = m_strUserID;
  111. m_pRoom->m_sMaxUser = 10;
  112. m_pRoom->strPassword = strPassword;
  113. m_pRoom->nIndex = g_pMain->m_ChatRoomArray.GetSize() +1;
  114. m_pRoom->m_sCurrentUser = 0;
  115.  
  116. if(!m_pRoom->AddUser(m_strUserID))
  117. {
  118. printf("Room creation fail 1\n");
  119. delete m_pRoom;
  120. goto return_fail;
  121. }
  122.  
  123. bool check = false;
  124. foreach_stlmap_nolock(itr,g_pMain->m_ChatRoomArray)
  125. {
  126. if(itr->second != nullptr && itr->second->strRoomName == strRoomName)
  127. {
  128. check = true;
  129. break;
  130. }
  131. }
  132.  
  133. if(!g_pMain->m_ChatRoomArray.PutData(m_pRoom->nIndex,m_pRoom) || check)
  134. {
  135. printf("Room creation fail 2\n");
  136. delete m_pRoom;
  137. goto return_fail;
  138. }
  139.  
  140. m_ChatRoomIndex = m_pRoom->nIndex;
  141.  
  142. //190B 05 01 0200 0500 72 65 73 75 6C 00 0100 0A00 00000000
  143.  
  144. result << uint8(0x05) << uint8(1) << uint16(m_pRoom->nIndex) << m_pRoom->strRoomName << uint8(isMeChatroom(m_pRoom->nIndex)) << m_pRoom->m_sCurrentUser << m_pRoom->m_sMaxUser << uint32(0);
  145.  
  146. Send(&result);
  147. return;
  148.  
  149. return_fail:
  150. result << uint8(0x05) << uint8(0);
  151. Send(&result);
  152. }
  153.  
  154. void CUser::ChatRoomJoin(Packet & pkt)
  155. {
  156. /*Result opcedes
  157. * 0 = Successfully
  158. * 1 = Already in room
  159. * 2 = Room does not exit !
  160. * 3 = Password lenght is correct
  161. * 4 = Password does not match
  162. * 5 = Nation do not match */
  163.  
  164. uint16 roomID ;
  165. uint8 isPassword ;
  166. std::string strPassword ;
  167.  
  168. pkt >> roomID >> isPassword >> strPassword;
  169.  
  170. _CHAT_ROOM* pRoom = g_pMain->m_ChatRoomArray.GetData(roomID);
  171.  
  172. uint8 nResult = 0;
  173.  
  174. if(g_pMain->m_ChatRoomArray.GetData(roomID) != nullptr)
  175. pRoom->m_UserList.erase(roomID);
  176.  
  177. if(pRoom == nullptr ||
  178. pRoom->m_sMaxUser < pRoom->m_sCurrentUser+1)
  179. nResult = 2;
  180.  
  181. if(pRoom->isPassword() &&
  182. STRCASECMP(strPassword.c_str(), pRoom->strPassword.c_str()) != 0)
  183. nResult = 4;
  184.  
  185. if(!pRoom->AddUser(GetName()))
  186. nResult = 2;
  187.  
  188. Packet result(WIZ_NATION_CHAT, uint8(CHATROOM_MANUEL));
  189.  
  190. result << uint8(CHATROOM_JOIN) << nResult << roomID;
  191.  
  192. Send(&result);
  193.  
  194. if(nResult == 0)
  195. m_ChatRoomIndex = pRoom->nIndex;
  196. }
  197.  
  198. void CUser::ChatroomLeave(Packet & pkt)
  199. {
  200. uint16 RoomID = pkt.read<uint16>();
  201. _CHAT_ROOM* pRoom = g_pMain->m_ChatRoomArray.GetData(RoomID);
  202.  
  203. if(pRoom == nullptr)
  204. return;
  205.  
  206. // Kullanıcıları odadan atma
  207.  
  208. if(pRoom->isAdministrator(GetName()) == 2 )
  209. g_pMain->m_ChatRoomArray.DeleteData(RoomID);
  210.  
  211. Packet result(WIZ_NATION_CHAT, uint8(CHATROOM_MANUEL));
  212.  
  213. result << uint8(CHATROOM_LEAVE) << uint8(0);
  214.  
  215. Send(&result);
  216. }
  217.  
  218. void CUser::ChatRoomChat(std::string * strMessage, std::string strSender)
  219. {
  220. CUser* pUser = g_pMain->GetUserPtr(strSender, TYPE_CHARACTER);
  221.  
  222. if(pUser == nullptr)
  223. return;
  224.  
  225. Packet result(WIZ_CHAT,uint8(CHATROM_CHAT));
  226. result.DByte();
  227. result << uint8(0) << pUser->GetSocketID() << pUser->GetName() << *strMessage << pUser->GetZoneID();
  228. //10 21 00 0701 0B00 7370656369616C6C697374 0600 74656B726172 15
  229.  
  230.  
  231.  
  232. SendChatRoom(result);
  233. }
  234.  
  235. void CUser::ChatroomAdmin(Packet & pkt)
  236. {
  237. //19 0B 0C 00 0300 0500 726573756C 1802 0A00 0100 1802 0B00 4D617844616D616765336B
  238.  
  239. Packet result(WIZ_NATION_CHAT,uint8(CHATROOM_MANUEL));
  240.  
  241. uint16 count = 0 , subpkt = pkt.read<uint8>();
  242.  
  243. result << uint8(CHATROOM_ADMIN) << uint8(0) << subpkt;
  244.  
  245. _CHAT_ROOM* pRoom = g_pMain->m_ChatRoomArray.GetData(m_ChatRoomIndex);
  246.  
  247. if(pRoom == nullptr)
  248. return;
  249.  
  250. result.DByte();
  251.  
  252. result << pRoom->strRoomName << uint8(0x18) << uint8(0x02) << pRoom->m_sMaxUser << pRoom->m_sCurrentUser ;
  253.  
  254. foreach(itr,pRoom->m_UserList)
  255. {
  256. CUser* pSendUser = g_pMain->GetUserPtr(itr->second,TYPE_CHARACTER);
  257.  
  258. if(pSendUser == nullptr)
  259. continue;
  260.  
  261. result << uint8(0x18) << uint8(pRoom->isAdministrator(pSendUser->GetName())) << pSendUser->GetName();
  262.  
  263. }
  264.  
  265. Send(&result);
  266. }
  267.  
  268. void CUser::ChatroomMemberoption(Packet & pkt)
  269. {
  270. uint8 subPkt = pkt.read<uint8>();
  271.  
  272. if(subPkt == 1)
  273. ChatroomKickout(pkt.read<uint16>());
  274. }
  275.  
  276. void CUser::ChatroomKickout(uint16 userID)
  277. {
  278. _CHAT_ROOM* pRoom = g_pMain->m_ChatRoomArray.GetData(m_ChatRoomIndex);
  279.  
  280. if(pRoom == nullptr)
  281. return;
  282.  
  283. Packet result(WIZ_NATION_CHAT,uint8(CHATROOM_MANUEL));
  284.  
  285. result << uint8(CHATROOM_MEMBEROPTION);
  286.  
  287. foreach(itr,pRoom->m_UserList)
  288. {
  289. if(itr->first == userID)
  290. {
  291. result << uint8(2);
  292. Send(&result);
  293. return;
  294. }
  295. }
  296.  
  297. pRoom->m_UserList.erase(userID);
  298.  
  299. result << uint8(1) << userID;
  300.  
  301. SendChatRoom(result);
  302. }
  303.  
  304. void CUser::SendChatRoom(Packet & result)
  305. {
  306. _CHAT_ROOM* pRoom = g_pMain->m_ChatRoomArray.GetData(m_ChatRoomIndex);
  307.  
  308. if(pRoom == nullptr)
  309. return;
  310.  
  311. foreach(itr,pRoom->m_UserList)
  312. {
  313. CUser* pSendUser = g_pMain->GetUserPtr(itr->second,TYPE_CHARACTER);
  314.  
  315. if(pSendUser == nullptr)
  316. continue;
  317.  
  318. pSendUser->Send(&result);
  319. }
  320. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement