jdev - 2021-07-18


  1. Kiwi has joined
  2. alexbay218 has joined
  3. gutuning has joined
  4. alexbay218 has left
  5. marc0s has left
  6. marc0s has joined
  7. gutuning has left
  8. gutuning has joined
  9. Kiwi has left
  10. pasdesushi has left
  11. gutuning has left
  12. gutuning has joined
  13. alacer has joined
  14. alacer has left
  15. alacer has joined
  16. alexbay218 has joined
  17. idk has left
  18. idk has joined
  19. kikuchiyo has left
  20. kikuchiyo has joined
  21. gutuning has left
  22. gutuning has joined
  23. idk has left
  24. scorch has joined
  25. alexbay218 has left
  26. gutuning has left
  27. gutuning has joined
  28. DebXWoody has joined
  29. alexbay218 has joined
  30. kikuchiyo has left
  31. kikuchiyo has joined
  32. lovetox has left
  33. wurstsalat has left
  34. scorch has left
  35. wancat has left
  36. scorch has joined
  37. kikuchiyo has left
  38. lovetox has joined
  39. gutuning has left
  40. gutuning has joined
  41. sonny has left
  42. sonny has joined
  43. kikuchiyo has joined
  44. wancat has joined
  45. kikuchiyo has left
  46. gutuning has left
  47. Squeaky Latex Folf has left
  48. idk has joined
  49. Squeaky Latex Folf has joined
  50. rom1dep has left
  51. idk has left
  52. wancat has left
  53. rom1dep has joined
  54. marc0s has left
  55. marc0s has joined
  56. mikeye has joined
  57. nephele has joined
  58. pulkomandy has left
  59. pulkomandy has joined
  60. debacle has joined
  61. mikeye has left
  62. wancat has joined
  63. kikuchiyo has joined
  64. paul has joined
  65. raghavgururajan has left
  66. gutuning has joined
  67. raghavgururajan has joined
  68. goffi has joined
  69. pulkomandy has left
  70. pulkomandy has joined
  71. kikuchiyo has left
  72. wurstsalat has joined
  73. kikuchiyo has joined
  74. idk has joined
  75. Alex has left
  76. Alex has joined
  77. goffi has left
  78. Alex has left
  79. Alex has joined
  80. goffi has joined
  81. emus has joined
  82. mikeye has joined
  83. Kiwi has joined
  84. idk has left
  85. idk has joined
  86. sonny has left
  87. paul has left
  88. gutuning has left
  89. gutuning has joined
  90. nephele has left
  91. nephele has joined
  92. nephele has left
  93. xecks has left
  94. xecks has joined
  95. pulkomandy has left
  96. pulkomandy has joined
  97. nephele has joined
  98. pulkomandy has left
  99. pulkomandy has joined
  100. pasdesushi has joined
  101. mikeye has left
  102. gutuning has left
  103. hiran has joined
  104. sonny has joined
  105. hiran Hi there. I'm quite new to XMPP and stumble over things that I am not sure how to solve. So I created a java application using the Smack API that can join a MUC and send messages. It can also display the other participants through the presence messages it receives. Now I want to send a message directly to one of the other participants. But if the presence messages are all like <room jid>/<nickname>, how can a message be sent to that participant directly?
  106. flow hiran, for non-anonymous rooms you lookup the actual JID of the MUC participant, otherwise you send a private message: https://xmpp.org/extensions/xep-0045.html#privatemessage
  107. goffi has left
  108. idk has left
  109. hiran I think the lookup is the problem. So far the server sends presence messages with these alternative JIDs. How could my client lookup the real user's jid?
  110. hiran Ah, what you referred to means I can send a message stanza to the occupant id (which is the <room jid>/<nickname> but it needs to be marked as chat, not as groupchat?
  111. hiran And then I guess that message would be send using the MUC rather than the XMPP connection? At least something I have not tried so far...
  112. jgart has left
  113. gutuning has joined
  114. hiran This is a bit strange for me. Here is how my code looke like, and I am alternating the last two lines: MessageBuilder builder = StanzaBuilder.buildMessage(); builder.setBody("Private message..."); builder.to(recipient); builder.ofType(Message.Type.chat); //muc.sendMessage(builder); connection.sendStanza(builder.build()); Now if I use the code as-is (and send the message via the XMPP connection), the message seems to get swallowed. At least I do not see anything on the recipient side. If I use the line before (to send the line via the group chat), another XMPP client (GAIM on Ubuntu 20) displays the message as if it were part of the group chat. I am still confused if I maybe have the right code but interprete the result wrongly?
  115. paul has joined
  116. gutuning has left
  117. marc0s has left
  118. marc0s has joined
  119. MattJ Is the recipient address a user or a MUC JID?
  120. pep. > Ah, what you referred to means I can send a message stanza to the occupant id (which is the <room jid>/<nickname> but it needs to be marked as chat, not as groupchat? If you do that over a MUC don't forget to include <x/> to indicate it's through MUC. Same tag as in the join presence
  121. pep. I don't know how to do that in smacks, or if there are helpers
  122. hiran Thank you, @pep. I will try to find something
  123. flow hiran, what pep said, you need to "builder.addExtension(new MUCUser())"
  124. pep. hiran: otherwise you can get the real jid of a participant in their presence, the one sent by the muc during join, or after when they join
  125. hiran The x element is not mandatory. According to https://xmpp.org/extensions/xep-0045.html#privatemessage: Note: because this requirement was only added in revision 1.28 of this XEP, receiving entities MUST NOT rely on the existence of the <x/> element on private messages for proper processing.
  126. pep. (right?)
  127. pep. hiran: it just makes it easier on everybody to distinguish
  128. pep. Please do :)
  129. hiran No, the presence messages to not contain the real JIDs, only the room JIDs
  130. flow hiran, well it explicitly mentions just receiving entities, not sending ones :)
  131. hiran I agree I should send the x and I will if I see a chance. Right now I am still seaching how to get Smack to show me what is going on underneath...
  132. flow but yes, it may work well without the <x/>. I would still recommend it
  133. flow hiran, SmackConfiguration.Debug=true
  134. flow hiran, SmackConfiguration.DEBUG=true
  135. hiran :-)
  136. wancat has left
  137. Sam has left
  138. wancat has joined
  139. kikuchiyo has left
  140. kikuchiyo has joined
  141. dezant has left
  142. Sam has joined
  143. debacle has left
  144. nephele has left
  145. paul has left
  146. paul has joined
  147. dezant has joined
  148. nephele has joined
  149. wancat has left
  150. gutuning has joined
  151. marc0s has left
  152. marc0s has joined
  153. marc0s has left
  154. marc0s has joined
  155. Sam "For each extended service discovery information form" does that mean there can be multiple XEP-0128 forms in a single disco#info response? The spec makes it seem like there's only one and I've been operating under that assumption for ages.
  156. gutuning has left
  157. Sam There's a thing in the revision history that says "now incorrect information" about multiple forms was removed, but not what that is, so maybe there used to be able to be multiple but I still can't tell (or maybe it used to say you only had one and they removed it thinking that would make it clear that there could be multiple, but there aren't)
  158. Link Mauve Yes, there can be more than one.
  159. Link Mauve For instance, if you want to support both older and newer XEP-0363 clients.
  160. Sam Ooh, no, there it is. It's tucked away in the implementation details at the very end. Doesn't mention it anywhere else in the document and definitely nowhere normative where it would make sense.
  161. Sam throws things
  162. Sam (thanks)
  163. Martin has left
  164. Martin has joined
  165. wurstsalat has left
  166. wurstsalat has joined
  167. goffi has joined
  168. scorch has left
  169. hiran has left
  170. mikeye has joined
  171. wurstsalat has left
  172. wurstsalat has joined
  173. hiran has joined
  174. marc0s has left
  175. marc0s has joined
  176. hiran Ha! Now, by looking at the debug output I found out that the private message my code is sending does indeed look similar to the message in XEP-045. The x element is still missing. And I was able to see that the server is actually delivering a message where the recipient jid was correctly resolved, and the x was even contained. So now it is more a matter of correctly processing that private message on recipient side, which I should be able to do. And I still need to figure out how to add an x...
  177. gutuning has joined
  178. Link Mauve hiran, flow told you how earlier: 12:36:47 flow> hiran, what pep said, you need to "builder.addExtension(new MUCUser())"
  179. gutuning has left
  180. hiran Ack. I missed that one before.
  181. hiran Confirmed: I do have the x added, just as suggested in the XEP. :-)
  182. alexbay218 has left
  183. hiran I also verified if I send the correctly constructed message via the MUC the type gets translated into 'groupchat' which I do not want. So it is important to send private messages via the connection directly. Which kind of makes sense but I was not sure of.
  184. Kiwi has left
  185. wancat has joined
  186. scorch has joined
  187. mikeye has left
  188. pasdesushi has left
  189. gutuning has joined
  190. pasdesushi has joined
  191. scorch has left
  192. gutuning has left
  193. hiran So my next goal is to send structured data - not just data that is serialized to a string and sent as message body. How do I best accomplish this via the Smack API? Do I have to introduce a new stanza type (other than Message)? Do I have to go via Extensions, or ...
  194. pep. <message> is by design extensible. You don't have to add another stanza type, you can put stuff inside it. <message><foo xmlns='domain.tld:my:ns'>MyData</foo></message>
  195. pep. If you need a query/response mechanism you can do the same with IQs
  196. pep. (note that you can serialize to XML directly and include it into your private container :))
  197. hiran Sounds good. I'd prefer to stick with Messages. So then it is about the content. I guess I do not need to fill the body. But how do I add the custom content?
  198. hiran Is the keyword 'Extension'? Then I investigate in that respect...
  199. pep. With Smacks I don't know sorry. flow ^
  200. nephele has left
  201. nephele has joined
  202. pep. Protocol-wise, just see how XEPs are defined, they're just saying "This TAG with this NS can be used to convey X", there's nothing to "declare" in XMPP. Also you only need a XEP (or any kind of public document) if you want other people to use it in the wild
  203. gutuning has joined
  204. pep. Protocol-wise, just see how XEPs are defined, they're just saying "This TAG with this NS can be used to convey X inside a (message|iq|presence)", there's nothing to "declare" in XMPP. Also you only need a XEP (or any kind of public document) if you want other people to use it in the wild
  205. pep. If you do want to tell other entities that you support this feature, you may also define a disco feature (to be added to your list of features on your client)
  206. hiran Well for now I am creating an XMPP client application that shall be capable of sending message to other clients of that type. It will be a closed system (a game indeed) so I do not think I need to open up the communication and get it standardized. But I need to send structured data - which I theoretically could accomplish by serializing to XML or JSON and put that string into the message body. This would look awkward but for sure work.
  207. pep. (say you used 'domain.tld:my:ns' as NS, you can reuse this as a disco feature)
  208. pep. Yeah that's not exactly what body is for. It will work for sure but that's not the meaning of this element :)
  209. hiran Ah yes, I probably reached the moment where to define that namespace. But even if I had that string (I can make up something) I would not yet know where to put it on Smack
  210. pep. I guess the same way as earlier with build.addExtension(new YourExtension())
  211. pep. See how MucUser is defined
  212. pep. builder*
  213. hiran Ok, then Extension it is. Hmmm, That might be an idea.
  214. hiran Strange. I am surfing https://github.com/igniterealtime/Smack/tree/master/smack-core/src/main/java/org/jivesoftware/smack/packet but there is no MUCUser although I am making use of it?
  215. pep. https://github.com/igniterealtime/Smack/blob/3d4e7938a7cc3fa511521702be7688e42a5ff20f/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/packet/MUCUser.java
  216. Alex has left
  217. hiran Thanks. smackx indeed
  218. pep. (dunno why this is pointing to a specific commit..)
  219. Alex has joined
  220. pep. https://github.com/igniterealtime/Smack/blob/master/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/packet/MUCUser.java
  221. sonny has left
  222. sonny has joined
  223. hiran I think that is good enough. i will try to implement a similar pattern. Although the toXML code looks, well it may be normal in the Smack world.
  224. pep. :)
  225. sonny has left
  226. sonny has joined
  227. sonny has left
  228. scorch has joined
  229. sonny has joined
  230. wancat has left
  231. mac has joined
  232. flow toXML() is one of the parts in Smack that has a long history. There may be very well 2 or 3 styles of implementation in XML (if you curious, the older 10-15 year old styles are probably in smack-legacy). These days you want to use the XmlStringBuilder in Smack, which I find very effective in serializing something back to XML (in absence of something like JAXB).
  233. flow hiran, ↑
  234. flow let me know if you have questions, I am usually around here. but I am probably not for long right now, as we just uncovered our inflatable pool :)
  235. sonny has left
  236. sonny has joined
  237. Alex has left
  238. wuuko has left
  239. wuuko has joined
  240. Alex has joined
  241. stuart.j.mackintosh has left
  242. wuuko has left
  243. wuuko has joined
  244. wancat has joined
  245. pasdesushi has left
  246. hiran has left
  247. gutuning has left
  248. pasdesushi has joined
  249. scorch has left
  250. asdgfdgx has joined
  251. scorch has joined
  252. asdgfdgx has left
  253. marc0s has left
  254. marc0s has joined
  255. gutuning has joined
  256. marc0s has left
  257. wuuko has left
  258. jgart has joined
  259. marc0s has joined
  260. wuuko has joined
  261. nephele has left
  262. gutuning has left
  263. gutuning has joined
  264. gutuning has left
  265. mac has left
  266. debacle has joined
  267. nephele has joined
  268. nephele has left
  269. scorch has left
  270. Alex has left
  271. Alex has joined
  272. marc has left
  273. scorch has joined
  274. wuuko has left
  275. goffi has left
  276. pulkomandy has left
  277. sonny has left
  278. pulkomandy has joined
  279. wuuko has joined
  280. sonny has joined
  281. marc has joined
  282. gutuning has joined
  283. sonny has left
  284. sonny has joined
  285. nephele has joined
  286. marc has left
  287. marc has joined
  288. scorch has left
  289. goffi has joined
  290. sonny has left
  291. sonny has joined
  292. marc has left
  293. scorch has joined
  294. marc has joined
  295. emus has left
  296. hiran has joined
  297. gutuning has left
  298. gutuning has joined
  299. hiran Ok, so I managed to get my structured data (so far very simple just a float) into the stanza to be sent. Now, when I receive such a message, on the debug output I can see the correct message is coming in but I fail to parse it. I am trying to call message.getExtension(extensionclass) and message.getExtension(namespace) but for both I get the IllegalStateException: Extension element is not of expected class "XXX", because there is no according extension element provider registered with ProviderManager It seems I am missing one step still. Will try to find the ProviderManager...
  300. marc has left
  301. hiran Ok, seems now I understand where the parsing happens: https://github.com/igniterealtime/Smack/blob/master/smack-core/src/main/java/org/jivesoftware/smack/provider/Provider.java
  302. marmistrz has left
  303. marmistrz has joined
  304. gutuning has left
  305. nephele has left
  306. marc has joined
  307. scorch has left
  308. hiran I am impressed. This really seems to work... Now the only thing I am missing is GAIM tells me that sooo many private messages are still unread, although my custom application already processed them. Is there a way to mark a message as 'read' or 'consumed'?
  309. scorch has joined
  310. marc has left
  311. Martin GAIM? 😯
  312. Martin When did they rename that to pidgin? 2006?
  313. pep. hiran, see chat markers or read receipts, the XEPs
  314. pep. What do you mean "consume"?
  315. Martin I'd also recommend to use a client from within the last decade.
  316. gutuning has joined
  317. marc has joined
  318. hiran Smack is outdated? Maybe that explains why I am struggling to find up to date documentation. But which client would be more up to date? I am still on Java...
  319. hiran With 'consume' I mean to indicate to the server that this message is processed and does not longer have to be queued. It is quite a standard pattern in JMS. Seems like XMPP does not have such components?
  320. gutuning has left
  321. Martin > Smack is outdated? Maybe that explains why I am struggling to find up to date documentation. I'm talking about GAIM.
  322. Kiwi has joined
  323. sonny has left
  324. sonny has joined
  325. sonny has left
  326. sonny has joined
  327. hiran @pep: I will check read receipts, thank you
  328. hiran @Martin: In Ubuntu 20 it is nowhere visible that GAIM should be outdated. Hang on: The windows says Gajim. Is that still outdated=
  329. mac has joined
  330. hiran So I am running Gajim 1.1.3 ( https://gajim.org/ )
  331. wurstsalat On Ubuntu 20 you'll have an outdated version of Gajim, yes ;) current version is 1.3, and it's actively developed
  332. wurstsalat Gajim 1.3 also makes use of read markers, fyi
  333. wuuko has left
  334. wuuko has joined
  335. Alex has left
  336. marc has left
  337. kikuchiyo has left
  338. scorch has left
  339. DebXWoody has left
  340. scorch has joined
  341. nephele has joined
  342. pep. hiran, gajim and gaim are two différent projects, one of which (gaim) renamed (pidgin) around 2006 as Martin said, and is far to be a recommended client nowadays :P
  343. Martin > So I am running Gajim 1.1.3 ( https://gajim.org/ ) I'm relieved. 😃
  344. pep. haha
  345. emus has joined
  346. kikuchiyo has joined
  347. gutuning has joined
  348. hiran sorry for being sooo nooby. But it seems you guys are having fun! Nevertheless you helped me really quickly. :-)
  349. hiran Thank you so much for that
  350. pep. :)
  351. hiran Regarding message receipts: I am having a look at https://xmpp.org/extensions/xep-0184.html It is what I intended, but it also says the sender of a message needs to actively ask for a receipt message. I think this is not my case.
  352. hiran I was simply wondering why one XMPP tells me there are 185 unread messages while they were at the same time received and processed by the other client (logged in on the same JID obviously). Is that maybe the normal behaviour and I should completely ignore Gajim?
  353. mac has left
  354. kikuchiyo has left
  355. gutuning has left
  356. pep. This is not your case as in, you don't want to ask for them?
  357. marc has joined
  358. marc has left
  359. marc has joined
  360. marc has left
  361. marc has joined
  362. hiran Exactly. The messages sent out by my application do not ask for a receipt. The messages are also received by my application. In parallel they are received by Gajim, and that one tells me to read them all.
  363. marc has left
  364. marc has joined
  365. marc has left
  366. hiran Would it help to remove the text body so Gajim knows there is nothing for it to display? I will give that a try...
  367. marc has joined
  368. marc has left
  369. marc has joined
  370. pep. Sure yes, if you don't need body, remove it
  371. pep. it's not mandatory
  372. marc has left
  373. marc has joined
  374. kikuchiyo has joined
  375. nephele has left
  376. mac has joined
  377. wurstsalat has left
  378. emus has left
  379. emus has joined
  380. hiran Looks like removing the message body did silence Gajim. Now that stuff works to my taste. XMPP is really easy to customize. Whoever worked on the design and standardization: Well done!
  381. hiran has left
  382. pep. If you ever want to have a peak into the future btw, gajim provides repositories for Debian/Ubuntu :)
  383. mac has left
  384. pep. https://gajim.org/download/#nightly-package-from-git-debian-ubuntu
  385. pep. Ah they're gone
  386. marc0s has left
  387. marc0s has joined
  388. marc has left
  389. marc has joined
  390. marc has left
  391. marc has joined
  392. marc has left
  393. marc has joined
  394. marc has left
  395. marc has joined
  396. marc has left
  397. marc has joined
  398. marc has left
  399. marc has joined
  400. marc has left
  401. marc has joined
  402. marc has left
  403. marc has joined
  404. marc has left
  405. marc has joined
  406. scorch has left
  407. marc has left
  408. marc has joined
  409. marc has left
  410. marc has joined
  411. marc has left
  412. marc has joined
  413. marc has left
  414. gutuning has joined
  415. marc has joined
  416. marc has left
  417. marc has joined
  418. marc has left
  419. marc has joined
  420. marc has left
  421. marc has joined
  422. marc has left
  423. marc has joined
  424. jgart has left
  425. marc has left
  426. marc has joined
  427. marc has left
  428. scorch has joined
  429. marc has joined
  430. marc has left
  431. jgart has joined
  432. marc has joined
  433. marc has left
  434. marc has joined
  435. marc has left
  436. marc has joined
  437. marc has left
  438. scorch has left
  439. marc has joined
  440. marc has left
  441. marc0s has left
  442. marc0s has joined
  443. marc has joined
  444. marc has left
  445. marc has joined
  446. marc has left
  447. marc has joined
  448. marc has left
  449. marc has joined
  450. marc has left
  451. debacle has left
  452. marc has joined
  453. marc has left
  454. marc has joined
  455. marc has left
  456. marc has joined
  457. marc has left
  458. scorch has joined
  459. marc has joined
  460. marc has left
  461. marc has joined
  462. marc has left
  463. marc has joined
  464. marc has left
  465. marc has joined
  466. marc has left
  467. marc has joined
  468. marc has left
  469. marc has joined
  470. marc has left
  471. marc has joined
  472. marc has left
  473. marc has joined
  474. marc has left
  475. marc has joined
  476. marc has left
  477. marc has joined
  478. scorch has left
  479. marc has left
  480. marc has joined
  481. marc has left
  482. marc has joined
  483. marc has left
  484. marc has joined
  485. marc has left
  486. marc has joined
  487. marc has left
  488. marc has joined
  489. marc has left
  490. goffi has left
  491. marc has joined
  492. marc has left
  493. marc has joined
  494. marc has left
  495. marc has joined
  496. emus has left
  497. marc has left
  498. marc has joined
  499. marc has left
  500. marc has joined
  501. marc has left
  502. marc has joined
  503. marc has left
  504. marc has joined
  505. marc has left
  506. marc has joined
  507. marc has left
  508. marc has joined
  509. marc has left
  510. marc has joined
  511. marc has left
  512. marc has joined
  513. marc has left
  514. marc has joined
  515. marc has left
  516. marc has joined
  517. marc has left
  518. marc has joined
  519. marc has left
  520. marc has joined
  521. marc has left
  522. marc has joined
  523. marc has left
  524. marc has joined
  525. marc has left
  526. Kiwi has left
  527. marc has joined
  528. marc has left
  529. marc has joined
  530. marc has left
  531. marc has joined
  532. scorch has joined
  533. marc has left
  534. marc has joined
  535. marc has left
  536. marc has joined
  537. marc has left
  538. marc has joined
  539. marc has left
  540. marc has joined
  541. marc has left
  542. marc has joined
  543. marc has left
  544. marc has joined
  545. marc has left
  546. marc has joined
  547. marc has left
  548. marc has joined
  549. marc has left
  550. marc has joined
  551. nephele has joined
  552. marc has left
  553. nephele has left
  554. marc has joined
  555. marc has left
  556. marc has joined
  557. marc has left
  558. marc has joined
  559. marc has left
  560. marc has joined
  561. marc has left
  562. marc has joined
  563. marc has left
  564. marc has joined
  565. marc has left
  566. marc has joined
  567. marc has left
  568. gutuning has left
  569. gutuning has joined
  570. marc has joined
  571. marc has left
  572. marc has joined
  573. marc has left
  574. marc has joined
  575. marc has left
  576. marc has joined
  577. marc has left
  578. marc has joined
  579. marc has left
  580. marc has joined
  581. marc has left
  582. marc has joined
  583. marc has left
  584. marc has joined
  585. marc has left
  586. marc has joined
  587. marc has left
  588. marc has joined
  589. marc has left
  590. marc has joined
  591. marc has left
  592. kikuchiyo has left
  593. marc has joined
  594. marc has left
  595. marc has joined
  596. marc has left
  597. marc has joined
  598. marc has left
  599. marc has joined
  600. marc has left
  601. marc has joined
  602. marc has left
  603. marc has joined
  604. marc has left
  605. marc has joined
  606. marc has left
  607. marc has joined
  608. marc has left
  609. lovetox has left
  610. marc has joined
  611. marc has left
  612. marc has joined
  613. pasdesushi has left
  614. marc has left
  615. marc has joined
  616. marc has left
  617. marc has joined
  618. marc has left
  619. marc has joined
  620. marc has left
  621. marc has joined
  622. marc has left
  623. marc has joined
  624. marc has left
  625. marc has joined
  626. marc has left
  627. marc has joined
  628. marc has left
  629. marc has joined
  630. marc has left
  631. marc has joined
  632. marc has left
  633. marc has joined
  634. marc has left
  635. marc has joined
  636. marc has left
  637. marc has joined
  638. marc has left
  639. marc has joined
  640. marc has left
  641. marc has joined
  642. marc has left
  643. marc has joined
  644. marc has left
  645. marc has joined
  646. marc has left
  647. marc has joined
  648. marc has left
  649. marc has joined
  650. marc has left
  651. marc has joined
  652. wuuko has left
  653. marc has left
  654. lovetox has joined
  655. marc has joined
  656. marc has left
  657. marc has joined
  658. marc has left
  659. marc has joined
  660. marc has left
  661. marc has joined
  662. marc has left
  663. marc has joined
  664. marc has left
  665. marc has joined
  666. marc has left
  667. marc has joined
  668. marc has left
  669. marc has joined
  670. marc has left
  671. marc has joined
  672. marc has left
  673. marc has joined
  674. marc has left
  675. marc has joined
  676. marc has left
  677. marc has joined
  678. marc has left
  679. marc has joined
  680. marc has left
  681. marc has joined
  682. marc has left
  683. marc has joined
  684. marc has left
  685. marc has joined
  686. marc has left
  687. marc has joined
  688. marc has left
  689. marc has joined
  690. marc has left
  691. marc has joined
  692. marc has left
  693. marc has joined
  694. marc has left
  695. marc has joined
  696. marc has left