Guest User

Untitled

a guest
Nov 18th, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.68 KB | None | 0 0
  1. Protocol documentation for v1.4
  2. --------------------------------
  3.  
  4. Meta
  5. ====
  6.  
  7. В качестве транспорта используется Flash.Network.NetConnection и AMF3. В протоколе есть и push-, и pull-методы.
  8. В дальнейшем, push-методы помечены [MSG] и далее именуются сообщениями, pull - [RPC].
  9. Для push-вызовов используется единая точка входа _event_
  10.  
  11. public function event(type : String, message : String, data : Object) : void
  12.  
  13. Этот метод должен быть определен у объекта, используемого как NetConnection.client.
  14.  
  15. Аутентификация
  16. ==============
  17.  
  18. Аутентификация проводится при вызове NetConnection.connect через дополнительный параметр, передаваемый клиенту через flashvars:
  19.  
  20. var token = loaderInfo.parameters.token;
  21. var _nc = new NetConnection();
  22. _nc.connect(server, token);
  23.  
  24. После этого клиент должен ожидать либо разрыва соединения(`NetConnection.Connect.Rejected`, не авторизован), либо вызова `event("init", role, self:User)`.
  25.  
  26. Роли пользователей
  27. ==================
  28.  
  29. Роли пользователей по сути всего лишь маркеры для наборов разрешений. Итоговый набор разрешений пользователя может быть изменен на лету админом. На данный момент эти наборы разрешений выглядят так:
  30.  
  31. default_acl(<<"admin">>) ->
  32. [can_grant,
  33. can_prolong,
  34. can_moderate
  35. | default_acl(<<"active">>) ];
  36.  
  37. default_acl(<<"chosen_one">>) ->
  38. [can_present,
  39. can_start_vote];
  40.  
  41. default_acl(<<"active">>) ->
  42. [can_chat,
  43. can_ask_voice];
  44.  
  45. default_acl(<<"passive">>) ->
  46. [can_vote].
  47.  
  48.  
  49. Пояснения по коду выше:
  50.  
  51. - роль **admin** расширяет роль **active**.
  52. - роль **chosen_one** не является самостоятельной, это mixin, добавляемый к **active**/**admin**.
  53.  
  54.  
  55. API Meta
  56. ========
  57.  
  58. Нижеследующее описание методов RPC сгруппировано по логическому типу сообщения.
  59. Под записью
  60.  
  61. >> ### presence
  62. >>
  63. >> [MSG] userJoin(User)
  64.  
  65. следует понимать следующий вызов с сервера:
  66.  
  67. event("presence", "userJoin", data : User)
  68.  
  69. Описанные следующим образом функции
  70.  
  71. >> ### chat
  72. >>
  73. >> `[RPC] message (ChatMessage())`
  74. >>
  75. >> `[RPC] load_chat : Array<Message>`
  76.  
  77. следует вызывать соответственно так:
  78.  
  79. var nc: NetConnection;
  80. ....
  81. var msg = new ChatMessage();
  82. msg.text = "some text";
  83. nc.call('message', null, msg);
  84.  
  85. и так:
  86.  
  87. function onChatLoad(messages : Array) : void
  88. {
  89. for each(var u : ChatMessage in messages) {
  90. ....
  91. }
  92. }
  93.  
  94. var nc: NetConnection;
  95. ....
  96. nc.call('load_chat', new Responder(onChatLoad));
  97.  
  98. API
  99. ====
  100.  
  101. ### presence
  102. `[MSG] userJoin(User)`
  103. пользователь подключился
  104.  
  105. `[MSG] userLeave(User)`
  106. пользователь отключился
  107.  
  108. `[MSG] askingVoice(SessID)`
  109. пользователь просит голос
  110.  
  111. `[RPC] list_users : Array<User>`
  112. получить список пользователей
  113.  
  114. `[RPC] get_asks : Array<int>`
  115. возвращает список просьб голоса(SessID пользователя), в правильном порядке.
  116.  
  117. ### chat
  118. `[MSG] chatMessage (ChatMessage)`
  119. Пришло новое сообщение в чат
  120.  
  121. `[RPC] message (ChatMessage())`
  122. Отправить сообщение
  123.  
  124. `[RPC] load_chat : Array<ChatMessage>`
  125. Загрузить все сообщения чата
  126.  
  127. ### moderate(админам и модераторам)
  128. `[MSG] moderateMessage (ChatMessage)`
  129. Новое сообщение на модерацию.
  130.  
  131. `[MSG] removeMessage (ChatMessage)`
  132. Модерация сообщения выполнена другим модератором
  133.  
  134. `[RPC] load_unmoderated : Array<ChatMessage>`
  135. Загрузка всего списка немодерированных сообщений.
  136.  
  137. `[RPC] accept (ChatMessage)`
  138. Пропустить сообщение в общий чат.
  139.  
  140. `[RPC] reject (ChatMessage)`
  141. Заблокировать сообщение.
  142.  
  143. `[RPC] pass_up (ChatMessage)`
  144. Отправить сообщение ведущему/ведущим.
  145.  
  146. ### publish
  147. `[MSG] startPublish (StreamData)`
  148. Начать публикацию потока на сервер. В StreamData смысл имеет только name, соединение используется уже установленное.
  149.  
  150. `[MSG] stopPublish`
  151. Очевидно.
  152.  
  153. ### play
  154. `[MSG] addStream (StreamData)`
  155. Добавить поток в отображение. Если StreamData.server_url == null, использовать текущее соединение с сервером.
  156.  
  157. `[MSG] updateStream (StreamData)`
  158. Обновить данные потока c id == StreamData.id.
  159.  
  160. `[MSG] removeStream (ID)`
  161. Очевидно.
  162.  
  163. `[RPC] get_streams : Array<StreamData>`
  164. Получить список отображаемых потоков.
  165.  
  166. ### present
  167. Здесь я еще ничего не решил пока.
  168.  
  169. `[MSG] set_url (URL)`
  170. TODO
  171.  
  172. `[RPC] get_presentations : Array<String>`
  173. Список URL индекс-файлов презентаций, которые пользователь добавил к конференции в веб-интерфейсе.
  174. Главная часть индекс-файла - массив **pages**, в котором находятся непосредственно URL отдельных слайдов.
  175.  
  176. `[RPC] set_slide (URL)`
  177. TODO
  178.  
  179. ### polls
  180. `[RPC] get_polls : Array<Poll>`
  181. получить список своих опросов
  182.  
  183. `[RPC] start_poll (PollID, ?timeout)`
  184. начать опрос, опционально время опроса
  185.  
  186. `[RPC] vote (PollID, indexOfAnswer)`
  187. ответ на опрос. **indexOfAnswer** - индекс выбранного ответа в Poll.answers.
  188.  
  189. `[MSG] newPoll (Poll)`
  190. Уведомление о старте опроса.
  191.  
  192. `[MSG] newVote ({PollId, indexOfAnswer})`
  193. Уведомление о голосе от пользователя (для реалтайм отображения процесса опроса).
  194.  
  195. ## Типы данных
  196.  
  197. Presentation {
  198. id: Number;
  199. label, slug : String;
  200. slides : Array<String>;
  201. }
  202.  
  203. ChatMessage {
  204. registerClassAlias("Message", ChatMessage);
  205.  
  206. id : Number; // filled on server
  207. author_name, author_id : String; // filled on server
  208. timestamp : Date = new Date();
  209. text : String;
  210. }
  211.  
  212. User {
  213. registerClassAlias("User", User);
  214.  
  215. // TODO: здесь должен быть какой-то вменяемый ID.
  216. id : Number;
  217. name : String;
  218. role : String;
  219. }
  220.  
  221. StreamData {
  222. id : Number,
  223. server_url : String; // if null use main server
  224. stream_name : String;
  225. audio_only : Boolean;
  226. }
  227.  
  228. Poll {
  229. id: Number;
  230. question: String;
  231. maxAnswersCount: Number; // количество возможных вариантов ответа.
  232. // если >1 - пользователь может проголосовать за несколько пунктов.
  233. // но это в будущем - сейчас можно только один ответ.
  234. answers: Array<String>;
  235. }
Add Comment
Please, Sign In to add comment