GroupUtility.pas 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  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":"","members":[], "operator":{"id":"","msg":""}}}
  113. // r
  114. // f
  115. // p()
  116. //invite: 'u.invite',
  117. INVITE_REQUEST: string = 'm.invite.q';
  118. // 会话
  119. // q {id:'', group:{id:[id...]}, message:{message}}
  120. // r(send) {id:'', ret:0, group:{id: [id...], message:{message}}}
  121. // b(members) {id:'', group:{id:[id...]}, message:{message}}
  122. MESSAGE_SAY_REQUEST: string = 'msg.say.q';
  123. MESSAGE_SAY_RESPONSE: string = 'msg.say.r';
  124. MESSAGE_SAY_BROADCAST: string = 'msg.say.b';
  125. // 离线消息
  126. // r(client) [{msg},{event}...]
  127. MESSAGE_OFFLINE_REQUEST: string = 'msg.off.q';
  128. MESSAGE_OFFLINE_RESPONSE: string = 'msg.off.r';
  129. // 会话回执
  130. // q {id:'', message:{id:[id...]}}
  131. // r(send) {id:'', ret:0}
  132. // mark: 'm.mk'
  133. // 消息回执
  134. // q {id:'', event:{id:[id...]}}
  135. // r(send) {id:'', ret:0}
  136. // mark: 'e.mk'
  137. // 回执
  138. // q {id:'', message:{id:[id...]}, event:{id:[id...]}}
  139. // r(send) {id:'', ret:0}
  140. MARK_MK_REQUEST: string = 'mi.mk.q';
  141. MARK_MK_RESPONSE: string = 'mi.mk.r';
  142. // 用户群组
  143. // r(send) {id:'', groups:[]}
  144. MEMBER_GS_REQUEST: string = 'u.gs.q';
  145. MEMBER_GS_RESPONSE: string = 'u.gs.r';
  146. // 请求群列表
  147. USER_LI_REQUEST: string = 'u.li.q';
  148. USER_LI_RESPONSE: string = 'u.li.r';
  149. //文件请求
  150. FILE_UPLOADED_REQUEST: string = 'f.up.q';
  151. FILE_UPLOADED_RESPONSE: string = 'f.up.r';
  152. FILE_UPLOADED_BROADCAST: string = 'f.up.b';
  153. SHAKEHANDS_STEP1: string = 'http://%s:%d/socket.io/?uid=%s&EIO=3&transport=polling&t=%d-0';
  154. SHAKEHANDS_STEP2: string = 'http://%s:%d/socket.io/?uid=%s&EIO=3&transport=polling&t=%d-0&sid=%s';
  155. WEBSOCKET_URL: string = '/socket.io/?uid=%s&EIO=3&transport=websocket&sid=%s';
  156. UPLOAD_URL: string = 'http://%s:%d/file/upload';
  157. DOWNLOAD_URL: string = 'http://%s:%d/file/%s';
  158. GATEWAY_URL: string = 'http://%s:%d/v1/servers';
  159. // style: 定义 {family: ,style: ,variant: ,weight: ,size: }
  160. // family: 字体 ["宋体", "9", "clBlack", ""]
  161. // style: normal, italic, oblique, inherit
  162. // variant: normal, small-caps, inherit
  163. // weight: normal, bold, bolder, lighter, 100-900, inherit
  164. // size: xx-small, x-small, small, medium, large, x-large, xx-large, smaller, larger, length, %, inherit
  165. function FontToJson(AFont: TFont): ISuperObject;
  166. function JsonToFont(AJo: ISuperObject): string;
  167. // function GetDefaultFont: string;
  168. implementation
  169. uses
  170. xFonts;
  171. function GetRGBColor(AColor: TColor): Integer;
  172. var
  173. R, B: Integer;
  174. begin
  175. R := AColor and $0000FF;
  176. B := AColor and $FF0000;
  177. B := B shr 16;
  178. if R = B then
  179. begin
  180. Result := AColor;
  181. Exit;
  182. end;
  183. R := R shl 16;
  184. Result := (AColor and $00FF00) or R or B;
  185. end;
  186. function GetBGRColor(AColor: TColor): Integer;
  187. var
  188. R, B: Integer;
  189. begin
  190. R := AColor and $FF0000;
  191. B := AColor and $0000FF;
  192. B := B shl 16;
  193. if R = B then
  194. begin
  195. Result := AColor;
  196. Exit;
  197. end;
  198. R := R shr 16;
  199. Result := (AColor and $00FF00) or R or B;
  200. end;
  201. function FontToJson(AFont: TFont): ISuperObject;
  202. begin
  203. if (AFont.Name = '宋体') and (AFont.Size = 9)
  204. and (AFont.Color = clBlack ) and (AFont.Style = []) then
  205. Exit;
  206. Result := SO('{}');
  207. if AFont.Name <> '宋体' then
  208. Result.S['family'] := AFont.Name;
  209. if AFont.Size <> 9 then
  210. Result.I['size'] := AFont.Size;
  211. if AFont.Color <> clBlack then
  212. Result.S['color'] := ColorToString(AFont.Color);
  213. if fsBold in AFont.Style then
  214. Result.S['weight'] := 'bold';
  215. if fsItalic in AFont.Style then
  216. Result.S['style'] := 'italic';
  217. if fsUnderline in AFont.Style then
  218. Result.S['decoration'] := 'underline';
  219. end;
  220. function JsonToFont(AJo: ISuperObject): string;
  221. var
  222. AFont: TFont;
  223. begin
  224. if AJo = nil then
  225. begin
  226. Result := '["宋体", 9, "clBlack", ""]';
  227. Exit;
  228. end;
  229. AFont := TFont.Create;
  230. try
  231. if AJo.S['family'] <> '' then
  232. AFont.Name := AJo.S['family']
  233. else
  234. AFont.Name := '宋体';
  235. if AJo.I['size'] <> 0 then
  236. AFont.Size := AJo.I['size']
  237. else
  238. AFont.Size := 9;
  239. if AJo.S['color'] <> '' then
  240. AFont.Color := StringToColor(AJo.S['color'])
  241. else
  242. AFont.Color := clBlack;
  243. if AJo.S['weight'] <> '' then
  244. AFont.Style := AFont.Style + [fsBold];
  245. if AJo.S['style'] <> '' then
  246. AFont.Style := AFont.Style + [fsItalic];
  247. if AJo.S['decoration'] <> '' then
  248. AFont.Style := AFont.Style + [fsUnderline];
  249. except
  250. Result := '["宋体", 9, "clBlack", ""]';
  251. FreeAndNil(AFont);
  252. end;
  253. Result := FontToString(AFont);
  254. FreeAndNil(AFont);
  255. end;
  256. end.