GroupUtility.pas 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. unit GroupUtility;
  2. interface
  3. uses
  4. Classes, SysUtils, Graphics, SuperObject;
  5. const
  6. // 创建
  7. // q {id:'', group:{name:'', type:0, creator:'', intro:'', notice:'', members: []}}
  8. // r(send) {id:'', ret:0, group: {}} // all
  9. // f(send) {id:'', ret:0, data: {}}
  10. // b(members) {id:'', group:{}}
  11. GROUP_CREATE_REQUEST: string = 'g.create.q';
  12. GROUP_CREATE_RESPONSE: string = 'g.create.r';
  13. GROUP_CREATE_FAIL: string = 'g.create.f';
  14. GROUP_CREATE_BROADCAST: string = 'g.create.b';
  15. //GROUP_CREATE_JSON:string = '{"id":"", "group":{"name":"", "type":"", "creator":"", "intro":"", "notice":"", "members":[]}}';
  16. // 更新
  17. // q {id:'', group:{id:'', intro:'', notice:'', members: [], managers: []}};
  18. // r(send) {id:'', ret:0, group: {}} // changes
  19. // f(send) {id:'', ret:0, data: {}}
  20. // b(members) {id:'', group:{}} // changes
  21. GROUP_UPDATE_REQUEST: string = 'g.update.q';
  22. GROUP_UPDATE_RESPONSE: string = 'g.update.r';
  23. GROUP_UPDATE_FAIL: string = 'g.update.f';
  24. GROUP_UPDATE_BROADCAST: string = 'g.update.b';
  25. // 删除
  26. // q {id:'', group:{id:[id...]}}
  27. // r(send) {id:'', ret:0, group:{id:[id...]}} 删除成功的编号
  28. // f(send) {id:'', ret:0, data: {}}
  29. // b(members) {id:'', group:{id:[id...]}}
  30. GROUP_DEL_REQUEST: string = 'g.del.q';
  31. GROUP_DEL_RESPONSE: string = 'g.del.r';
  32. GROUP_DEL_FAIL: string = 'g.del.f';
  33. GROUP_DEL_BROADCAST: string = 'g.del.b';
  34. // 根据 ID 查询
  35. // q {id:'', group:{id: 'id' /* or Array */}};
  36. // r(send) {id:'', ret:0, groups:[group...]};
  37. // f(send) {id:'', ret:0, data: {}}
  38. GROUP_GET_REQUEST: string = 'g.get.q';
  39. GROUP_GET_RESPONSE: string = 'g.get.r';
  40. GROUP_GET_FAIL: string = 'g.get.f';
  41. // 搜索
  42. // q {id:'', group:{id:'', name:'', intro:'', notice:'', members: [], managers: []}, skip:0, limit: 0};
  43. // r(send) {id:'', ret:0, groups:[group...], skip:0, limit: 0}
  44. // f(send) {id:'', ret:0, data: {}}
  45. GROUP_QUERY_REQUEST: string = 'g.search.q';
  46. GROUP_QUERY_RESPONSE: string = 'g.search.r';
  47. GROUP_QUERY_FAIL: string = 'g.search.f';
  48. // 添加
  49. // q {id:'', group:{id:''}};
  50. // r(send) {id:'', ret:0, group:{id:'', members: [id...], managers: [id...]}}
  51. // f(send) {id:'', ret:0, data: {}}
  52. MEMBER_QUERY_REQUEST: string = 'm.query.q';
  53. MEMBER_QUERY_RESPONSE: string = 'm.query.r';
  54. MEMBER_QUERY_FAIL: string = 'm.query.f';
  55. // 添加
  56. // q {id:'', group:{id:'', members: [id...], managers: [id...]}};
  57. // r(send) {id:'', ret:0, group:{id:'', members: [id...], managers: [id...]}}
  58. // f(send) {id:'', ret:1}
  59. // b {id:'', group:{id:'', members: [id...], managers: [id...]}}
  60. MEMBER_ADD_REQUEST: string = 'm.add.q';
  61. MEMBER_ADD_RESPONSE: string = 'm.add.r';
  62. MEMBER_ADD_FAIL: string = 'm.add.f';
  63. MEMBER_ADD_BROADCAST: string = 'm.add.b';
  64. // MEMBER_ADD_P: string = 'u.add.p';
  65. // 删除
  66. // q {id:'', group:{id:'', members: [id...], managers: [id...]}};
  67. // r(send) {id:'', ret:0, group:{id:'', members: [id...], managers: [id...]}}
  68. // f(send) {id:'', ret:0, data: {}}
  69. // b(members) {id:'', group:{id:'', members: [id...], managers: [id...]}}
  70. MEMBER_DEL_REQUEST: string = 'm.del.q';
  71. MEMBER_DEL_RESPONSE: string = 'm.del.r';
  72. MEMBER_DEL_FAIL: string = 'm.del.f';
  73. MEMBER_DEL_BROADCAST: string = 'm.del.b';
  74. // 更新
  75. // q {id:'', group:{id:'', members: [{id:'', alias:''}]}};
  76. // r(send) {id:'', ret:0, group:{id:'', members: [{id:'', alias:''}]}};
  77. // f(send) {id:'', ret:0, data: {}}
  78. // b(members) {id:'', group:{id:'', members: [{id:'', alias:''}]}};
  79. MEMBER_UPDATE_REQUEST: string = 'm.update.q';
  80. MEMBER_UPDATE_RESPONSE: string = 'm.update.r';
  81. MEMBER_UPDATE_FAIL: string = 'm.update.f';
  82. MEMBER_UPDATE_BROADCAST: string = 'm.update.b';
  83. // 申请
  84. // q {id:'', group:{id:'', apply:{uid:'', msg:''}}}
  85. // r(send) {id:''}
  86. // f(send) {id:'', ret:1}
  87. // 400 请求错误(一般缺少 group id)
  88. // 304 用户已存在
  89. // 405 群禁止用户加入
  90. // group type:
  91. // 0, 调用 u.add
  92. // 1, 申请加入
  93. // 4, 返回 405
  94. // p(managers) {id:'', group:{id:'', apply:{id:'', uid: '', msg:''}}}, 管理员接收到 apply.p, 发起 replay.q
  95. MEMBER_APPLY_REQUEST: string = 'm.apply.q';
  96. MEMBER_APPLY_RESPONSE: string = 'm.apply.r';
  97. MEMBER_APPLY_FAIL: string = 'm.apply.f';
  98. MEMBER_APPLY_P2P: string = 'm.apply.p';
  99. // 审核
  100. // q {id:'', group:{id:'', apply:{id:'', uid:'', msg:''}, reply:{id:'', uid:'', ret:0, msg}}}
  101. // ret:
  102. // 1 允许
  103. // 0 拒接
  104. // r(send) {id:'', _ret:0, group:{id:'', apply:{id:'', msg:''}, reply:{id:'', uid:'', ret:0, msg}}}
  105. // f(send) {id:'', ret:1}
  106. // p(apply & managers) {id:'', group:{id:'', apply:{id:'', uid:'', msg:''}, reply:{id:'', uid:'', ret:0, msg}}}
  107. MEMBER_REPLY_REQUEST: string = 'm.reply.q';
  108. MEMBER_REPLY_RESPONSE: string = 'm.reply.r';
  109. MEMBER_REPLY_FAIL: string = 'm.reply.f';
  110. MEMBER_REPLY_P2P: string = 'm.reply.p';
  111. // 添加禁言(群管理)
  112. // q {id:'', group:{id:'', uid:'', time:'', rule:''}};
  113. // r {id:'', ret:0, group:{id:'', uid:'', time:'', rule:''}};
  114. // f {id:'', ret:1, data: {}}
  115. // p {id:'', group:{id:'', uid:'', time:'', rule:''}};
  116. FORBID_ADD_REQUEST: string = 'fbd.add.q';
  117. FORBID_ADD_RESPONSE: string = 'fbd.add.r';
  118. FORBID_ADD_FAIL: string = 'fbd.add.f';
  119. FORBID_ADD_P2P: string = 'fbd.add.p';
  120. // 删除禁言(群管理)
  121. // q {id:'', group:{id:'', uid:''}};
  122. // r {id:'', ret:0, group:{id:'', uid:''}};
  123. // f {id:'', ret:1, data: {}}
  124. // p {id:'', group:{id:'', uid:''}};
  125. FORBID_DEL_REQUEST: string = 'fbd.del.q';
  126. FORBID_DEL_RESPONSE: string = 'fbd.del.r';
  127. FORBID_DEL_FAIL: string = 'fbd.del.f';
  128. FORBID_DEL_P2P: string = 'fbd.del.p';
  129. // 禁言列表(群管理)
  130. // q {id:'', group:{id:'', members: []}};
  131. // r {id:'', ret:0, group:{id:'', members: [{uid:'', time:'', rule:''}]}};
  132. FORBID_LIST_REQUEST: string = 'fbd.list.q';
  133. FORBID_LIST_RESPONSE: string = 'fbd.list.r';
  134. FORBID_LIST_FAIL: string = 'fbd.list.f';
  135. // 禁言列表(群用户)
  136. // q {id:'', group:{id:'', uid:''}};
  137. // r {id:'', ret:0, group:{id:'', uid:'', time:'', rule:''}};
  138. FORBID_GET_REQUEST: string = 'fbd.get.q';
  139. FORBID_GET_RESPONSE: string = 'fbd.get.r';
  140. FORBID_GET_FAIL: string = 'fbd.get.f';
  141. // 添加公告(群管理)
  142. // q {id:'', group:{id:'', nid:'', top:'', title:'', content:'', author:'', time:''}};
  143. // r {id:'', ret:0, group:{id:'', nid:'', top:'', title:'', content:'', time:'', author:''}};
  144. // f {id:'', ret:1, data: {}}
  145. // b {id:'', group:{id:'', nid:'', top:'', title:'', content:'', time:'', author:''}};
  146. NOTICE_ADD_REQUEST: string = 'ntc.add.q';
  147. NOTICE_ADD_RESPONSE: string = 'ntc.add.r';
  148. NOTICE_ADD_FAIL: string = 'ntc.add.f';
  149. NOTICE_ADD_BROADCAST: string = 'ntc.add.b';
  150. // 更新公告(群管理)
  151. // q {id:'', group:{id:'', nid:'', top:'', title:'', content:'', author:'', time:''}};
  152. // r {id:'', ret:0, group:{id:'', top:'', nid:'', title:'', content:'', time:'', author:''}};
  153. // f {id:'', ret:1, data: {}}
  154. // b {id:'', group:{id:'', nid:'', top:'', title:'', content:'', time:'', author:''}};
  155. NOTICE_UPDATE_REQUEST: string = 'ntc.update.q';
  156. NOTICE_UPDATE_RESPONSE: string = 'ntc.update.r';
  157. NOTICE_UPDATE_FAIL: string = 'ntc.update.f';
  158. NOTICE_UPDATE_BROADCAST: string = 'ntc.update.b';
  159. // 删除公告(群管理)
  160. // q {id:'', group:{id:'', notices:[nid:'', nid'']}};
  161. // r {id:'', ret:0, group:{id:'', notices:[nid:'', nid'']}};
  162. // f {id:'', ret:0, data: {}}
  163. // b {id:'', group:{id:'', nid:''}};
  164. NOTICE_DEL_REQUEST: string = 'ntc.del.q';
  165. NOTICE_DEL_RESPONSE: string = 'ntc.del.r';
  166. NOTICE_DEL_FAIL: string = 'ntc.del.f';
  167. NOTICE_DEL_BROADCAST: string = 'ntc.del.b';
  168. // 公告列表
  169. // q {id:'', group:{id:'', page:'1', count:'10', notices:[]}};
  170. // r {id:'', group:{id:'', page:'1', count:'10', notices:[{nid:'', top:'', title:'', content:'', author:'', time:''}]}};
  171. // f {id:'', ret:0, data: {}}
  172. // b {id:'', group:{id:'', members: [{id:'', alias:''}]}};
  173. NOTICE_GET_REQUEST: string = 'ntc.get.q';
  174. NOTICE_GET_RESPONSE: string = 'ntc.get.r';
  175. NOTICE_GET_FAIL: string = 'ntc.get.f';
  176. // 邀请加入
  177. // q "id":"","group":{"id":"","members":[], "operator":{"id":"","msg":""}}}
  178. // r
  179. // f
  180. // p()
  181. //invite: 'u.invite',
  182. INVITE_REQUEST: string = 'm.invite.q';
  183. // 会话
  184. // q {id:'', group:{id:[id...]}, message:{message}}
  185. // r(send) {id:'', ret:0, group:{id: [id...], message:{message}}}
  186. // b(members) {id:'', group:{id:[id...]}, message:{message}}
  187. MESSAGE_SAY_REQUEST: string = 'msg.say.q';
  188. MESSAGE_SAY_RESPONSE: string = 'msg.say.r';
  189. MESSAGE_SAY_BROADCAST: string = 'msg.say.b';
  190. // 离线消息
  191. // r(client) [{msg},{event}...]
  192. MESSAGE_OFFLINE_REQUEST: string = 'msg.off.q';
  193. MESSAGE_OFFLINE_RESPONSE: string = 'msg.off.r';
  194. // 会话回执
  195. // q {id:'', message:{id:[id...]}}
  196. // r(send) {id:'', ret:0}
  197. // mark: 'm.mk'
  198. // 消息回执
  199. // q {id:'', event:{id:[id...]}}
  200. // r(send) {id:'', ret:0}
  201. // mark: 'e.mk'
  202. // 回执
  203. // q {id:'', message:{id:[id...]}, event:{id:[id...]}}
  204. // r(send) {id:'', ret:0}
  205. MARK_MK_REQUEST: string = 'mi.mk.q';
  206. MARK_MK_RESPONSE: string = 'mi.mk.r';
  207. MARK_MK_B: string = 'mi.mk.b';
  208. MARK_A_Q: string = 'mi.a.q';
  209. MARK_A_R: string = 'mi.a.r';
  210. // // 用户群组
  211. // // r(send) {id:'', groups:[]}
  212. // MEMBER_GS_REQUEST: string = 'u.gs.q';
  213. // MEMBER_GS_RESPONSE: string = 'u.gs.r';
  214. // 请求群列表
  215. USER_LI_REQUEST: string = 'u.li.q';
  216. USER_LI_RESPONSE: string = 'u.li.r';
  217. //文件请求
  218. FILE_UPLOADED_REQUEST: string = 'f.up.q';
  219. FILE_UPLOADED_RESPONSE: string = 'f.up.r';
  220. FILE_UPLOADED_BROADCAST: string = 'f.up.b';
  221. //历史消息记录
  222. HISTORY_C_Q: string = 'h.c.q';
  223. HISTORY_C_R: string = 'h.c.r';
  224. HISTORY_H_Q: string = 'h.h.q';
  225. HISTORY_H_R: string = 'h.h.r';
  226. SHAKEHANDS_STEP1: string = 'http://%s:%d/socket.io/?uid=%s&EIO=3&transport=polling&t=%d-0';
  227. SHAKEHANDS_STEP2: string = 'http://%s:%d/socket.io/?uid=%s&EIO=3&transport=polling&t=%d-0&sid=%s';
  228. WEBSOCKET_URL: string = '/socket.io/?uid=%s&EIO=3&transport=websocket&sid=%s';
  229. UPLOAD_URL: string = 'http://%s:%d/file/upload';
  230. DOWNLOAD_URL: string = 'http://%s:%d/file/%s';
  231. GATEWAY_URL: string = 'http://%s:%d/v1/servers';
  232. //strike:删除线?
  233. // style: 定义 {family: ,style: ,variant: ,weight: ,size: }
  234. // family: 字体 ["宋体", "9", "clBlack", ""]
  235. // style: normal, italic, oblique, inherit
  236. // variant: normal, small-caps, inherit
  237. // weight: normal, bold, bolder, lighter, 100-900, inherit
  238. // size: xx-small, x-small, small, medium, large, x-large, xx-large, smaller, larger, length, %, inherit
  239. function FontToJson(AFont: TFont): ISuperObject;
  240. function JsonToFont(AJo: ISuperObject): string;
  241. // function GetDefaultFont: string;
  242. implementation
  243. uses
  244. xFonts;
  245. function GetRGBColor(AColor: TColor): Integer;
  246. var
  247. R, B: Integer;
  248. begin
  249. R := AColor and $0000FF;
  250. B := AColor and $FF0000;
  251. B := B shr 16;
  252. if R = B then
  253. begin
  254. Result := AColor;
  255. Exit;
  256. end;
  257. R := R shl 16;
  258. Result := (AColor and $00FF00) or R or B;
  259. end;
  260. function GetBGRColor(AColor: TColor): Integer;
  261. var
  262. R, B: Integer;
  263. begin
  264. R := AColor and $FF0000;
  265. B := AColor and $0000FF;
  266. B := B shl 16;
  267. if R = B then
  268. begin
  269. Result := AColor;
  270. Exit;
  271. end;
  272. R := R shr 16;
  273. Result := (AColor and $00FF00) or R or B;
  274. end;
  275. function FontToJson(AFont: TFont): ISuperObject;
  276. begin
  277. if (AFont.Name = '宋体') and (AFont.Size = 9)
  278. and (AFont.Color = clBlack ) and (AFont.Style = []) then
  279. Exit;
  280. Result := SO('{}');
  281. if AFont.Name <> '宋体' then
  282. Result.S['family'] := AFont.Name;
  283. if AFont.Size <> 9 then
  284. Result.I['size'] := AFont.Size;
  285. if AFont.Color <> clBlack then
  286. Result.S['color'] := ColorToString(AFont.Color);
  287. if fsBold in AFont.Style then
  288. Result.S['weight'] := 'bold';
  289. if fsItalic in AFont.Style then
  290. Result.S['style'] := 'italic';
  291. if fsUnderline in AFont.Style then
  292. Result.S['decoration'] := 'underline';
  293. if fsStrikeOut in AFont.Style then
  294. Result.S['line-through'] := 'line-through';
  295. end;
  296. function JsonToFont(AJo: ISuperObject): string;
  297. var
  298. AFont: TFont;
  299. begin
  300. if AJo = nil then
  301. begin
  302. Result := '["宋体", 9, "clBlack", ""]';
  303. Exit;
  304. end;
  305. AFont := TFont.Create;
  306. try
  307. if AJo.S['family'] <> '' then
  308. AFont.Name := AJo.S['family']
  309. else
  310. AFont.Name := '宋体';
  311. if AJo.I['size'] <> 0 then
  312. AFont.Size := AJo.I['size']
  313. else
  314. AFont.Size := 9;
  315. if AJo.S['color'] <> '' then
  316. AFont.Color := StringToColor(AJo.S['color'])
  317. else
  318. AFont.Color := clBlack;
  319. if AJo.S['weight'] <> '' then
  320. AFont.Style := AFont.Style + [fsBold];
  321. if AJo.S['style'] <> '' then
  322. AFont.Style := AFont.Style + [fsItalic];
  323. if AJo.S['decoration'] <> '' then
  324. AFont.Style := AFont.Style + [fsUnderline];
  325. if AJo.S['line-through'] <> '' then
  326. AFont.Style := AFont.Style + [fsStrikeOut];
  327. except
  328. Result := '["宋体", 9, "clBlack", ""]';
  329. FreeAndNil(AFont);
  330. end;
  331. Result := FontToString(AFont);
  332. FreeAndNil(AFont);
  333. end;
  334. end.