Fabianegg

Untitled

Jul 4th, 2020
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.16 KB | None | 0 0
  1. // ==UserScript==
  2. // @name Klanowicze online
  3. // @author Reskiezis
  4. // @description Dodatek do gry Margonem
  5. // @version 1.4
  6. // @match http://*.margonem.pl/
  7. // @match http://*.margonem.com/
  8. // @grant none
  9. // @namespace https://greasyfork.org/users/233329
  10. // ==/UserScript==
  11.  
  12. ((Engine, hero, $) => {
  13. 'use strict'
  14.  
  15. const chatInput = document.querySelector('.chat-tpl input')
  16.  
  17. const createStorage = () => {
  18. let storage = {}
  19.  
  20. try {
  21. storage = JSON.parse(
  22. localStorage.getItem('klanowicze_online')
  23. )
  24. } catch(error) {}
  25.  
  26. //assigns object to storage
  27. const setStorage = object => {
  28. const modifiedStorage = {
  29. ...storage,
  30. ...object
  31. }
  32.  
  33. storage = modifiedStorage
  34.  
  35. localStorage.setItem(
  36. 'klanowicze_online',
  37. JSON.stringify(modifiedStorage)
  38. )
  39. }
  40.  
  41. const getStorage = () => ({
  42. ...storage
  43. })
  44.  
  45. return { setStorage, getStorage }
  46. }
  47.  
  48. const {
  49. setStorage,
  50. getStorage
  51. } = createStorage()
  52.  
  53. let state = {
  54. wasMembersHidden: false,
  55. top: '10px',
  56. left: '200px',
  57. ...getStorage()
  58. }
  59.  
  60. //assigns object to state
  61. const setState = object => {
  62. state = {
  63. ...state,
  64. ...object
  65. }
  66. }
  67.  
  68. //assigns object to state and storage
  69. const updateMemory = object => {
  70. setState(object)
  71. setStorage(object)
  72. }
  73.  
  74. //Start UI
  75.  
  76. const appendCorners = element => {
  77. const cor1 = document.createElement('div')
  78. Object.assign(cor1.style, { background: 'url(img/tip-cor.png) no-repeat 0px 0px', position: 'absolute', top: '-6px', left: '-6px', width: '35px', height: '23px' })
  79. const cor2 = document.createElement('div')
  80. Object.assign(cor2.style, { background: 'url(img/tip-cor.png) no-repeat -35px 0px', position: 'absolute', bottom: '-6px', right: '-6px', width: '35px', height: '23px' })
  81. element.appendChild(cor1)
  82. element.appendChild(cor2)
  83. }
  84.  
  85. const container = document.createElement('div')
  86. container.id = 'klanowicze-online'
  87. container.classList.add('default-cursor')
  88. Object.assign(container.style, {
  89. boxSizing: 'border-box',
  90. position: 'absolute',
  91. left: state.left,
  92. top: state.top,
  93. border: '3px gold double',
  94. color: '#eeeeee',
  95. width: '210px',
  96. backgroundColor: 'black',
  97. fontSize: '16px',
  98. zIndex: 500
  99. })
  100.  
  101. const title = document.createElement('div')
  102. title.textContent = 'Klanowicze online'
  103. Object.assign(title.style, {
  104. fontSize: '1.1em',
  105. textAlign: 'center',
  106. fontWeight: 'bold',
  107. borderBottom: '1px solid gold',
  108. padding: '2px'
  109. })
  110. container.appendChild(title)
  111.  
  112. const membersTable = document.createElement('table')
  113. Object.assign(membersTable.style, {
  114. fontSize: '0.7em',
  115. width: '100%',
  116. borderCollapse: 'collapse',
  117. tableLayout: 'fixed'
  118. })
  119.  
  120. const membersTableWrapper = document.createElement('div')
  121. membersTableWrapper.hidden = state.areMembersHidden
  122. membersTableWrapper.style.padding = '1px'
  123.  
  124. membersTableWrapper.appendChild(membersTable)
  125. container.appendChild(membersTableWrapper)
  126.  
  127. const hideMembersButton = document.createElement('div')
  128. hideMembersButton.classList.add('do-action-cursor')
  129. hideMembersButton.textContent = state.areMembersHidden
  130. ? 'Rozwiń'
  131. : 'Zwiń'
  132. Object.assign(hideMembersButton.style, {
  133. fontSize: '0.8rem',
  134. textAlign: 'center',
  135. borderTop: '1px solid gold'
  136. })
  137. container.appendChild(hideMembersButton)
  138.  
  139. appendCorners(container)
  140.  
  141. $(container).draggable({
  142. cancel: 'table', //can't drag membersTable
  143. stop: function(){
  144. const { top, left } = container.style
  145. updateMemory({
  146. top,
  147. left
  148. })
  149. }
  150. })
  151.  
  152. //style table rows and cells
  153. const tableStyle = document.createElement('style')
  154. tableStyle.textContent = `
  155. .ko-row {
  156. border: solid;
  157. border-width: 1px 0;
  158. border-color: #5d5006;
  159. height: 1.6em;
  160. }
  161. .ko-row:hover {
  162. background: #3c3c16;
  163. }
  164. .ko-row:first-child {
  165. border-top: none;
  166. }
  167. .ko-row:last-child {
  168. border-bottom: none;
  169. }
  170. .ko-row > * {
  171. vertical-align: middle;
  172. }
  173.  
  174. .ko-add-to-group-cell, .ko-nick-cell {
  175. user-select: none;
  176. }
  177. .ko-add-to-group-cell:hover, .ko-nick-cell:hover {
  178. color: #eaeb74;
  179. }
  180.  
  181. .ko-add-to-group-cell {
  182. text-align: center;
  183. width: 12px;
  184. }
  185.  
  186. .ko-map-cell {
  187. text-align: right;
  188. white-space: nowrap;
  189. overflow: hidden;
  190. text-overflow: ellipsis;
  191. }
  192. `
  193. document.body.appendChild(tableStyle)
  194.  
  195. //End UI
  196.  
  197. const startWritingMessageTo = nick => {
  198. const chatInput = document.querySelector(
  199. '.chat-tpl .input-wrapper input'
  200. )
  201.  
  202. chatInput.value = `@${nick.replace(/ /g, '_')} `
  203. chatInput.focus()
  204. }
  205.  
  206. const chatWith = nick =>
  207. () =>
  208. startWritingMessageTo(nick)
  209.  
  210. const addToGroup = id =>
  211. () =>
  212. window._g(`party&a=inv&id=${id}`)
  213.  
  214. const fetchMembers = () =>
  215. new Promise(resolve => {
  216. //super API bulwo
  217. const clan = Engine.clan
  218. ? { ...Engine.clan } //shallow copy
  219. : Engine.clan
  220.  
  221. if(!clan)
  222. Engine.clan = {
  223. updateMembers(){}
  224. }
  225.  
  226. _g(`clan&a=members`, ({ members2 }) => {
  227. Engine.clan = clan
  228.  
  229. if(!members2){
  230. resolve(null)
  231. return
  232. }
  233.  
  234. resolve(members2)
  235. })
  236. })
  237.  
  238. // [ id, nick, lvl, prof, map, x, y, ?, onlineStatus, icon ]
  239. const MEMBER_TUPLE_LENGTH = 10
  240. const renderOnlineMembers = members => {
  241. if(members === null)
  242. return
  243.  
  244. const membersTableBody = document.createElement('tbody')
  245.  
  246. let onlineMembersCount = 0
  247. let wasHeroCounted = false
  248. for(let i = 0; i <= members.length; i += MEMBER_TUPLE_LENGTH){
  249. const onlineStatus = members[i+8]
  250. if(onlineStatus !== 'online')
  251. continue
  252.  
  253. onlineMembersCount++
  254.  
  255. const nick = members[i+1]
  256. if(nick === hero.nick){
  257. wasHeroCounted = true
  258. continue
  259. }
  260.  
  261. const id = members[i]
  262. const lvl = members[i+2]
  263. const prof = members[i+3]
  264. const map = members[i+4]
  265. const x = members[i+5]
  266. const y = members[i+6]
  267.  
  268. const row = membersTableBody.insertRow()
  269. row.classList.add('ko-row')
  270.  
  271. const addToGroupCell = row.insertCell()
  272. addToGroupCell.textContent = '+'
  273. addToGroupCell.dataset.tip = 'Dodaj do grupy'
  274. addToGroupCell.classList.add('ko-add-to-group-cell', 'do-action-cursor')
  275. addToGroupCell.addEventListener('click', addToGroup(id))
  276.  
  277. const nickCell = row.insertCell()
  278. nickCell.textContent = `${nick} (${lvl}${prof})`
  279. nickCell.classList.add('ko-nick-cell', 'do-action-cursor')
  280. nickCell.addEventListener('click', chatWith(nick))
  281.  
  282. const mapCell = row.insertCell()
  283. mapCell.textContent = map
  284. mapCell.dataset.tip = `${map} (${x},${y})`
  285. mapCell.classList.add('ko-map-cell')
  286. }
  287.  
  288. if(!wasHeroCounted)
  289. onlineMembersCount++
  290.  
  291. title.dataset.tip = onlineMembersCount === 1
  292. ? 'Jesteś tylko ty'
  293. : `${onlineMembersCount} klanowiczów (łącznie z tobą)`
  294.  
  295. if(membersTable.tBodies.length === 0){
  296. membersTable.appendChild(membersTableBody)
  297. return
  298. }
  299.  
  300. membersTable.replaceChild(membersTableBody, membersTable.tBodies[0])
  301. }
  302.  
  303. const fetchAndRenderOnlineMembers = () => {
  304. //don't interrupt changing character or sending message
  305. if(Engine.logOff || document.activeElement === chatInput)
  306. return
  307.  
  308. fetchMembers().then(renderOnlineMembers)
  309. }
  310.  
  311. let fetchMembersInterval = null
  312. const startMembersFetching = () => {
  313. fetchAndRenderOnlineMembers()
  314. fetchMembersInterval = setInterval(fetchAndRenderOnlineMembers, 10000)
  315. }
  316.  
  317. const stopMembersFetching = () => {
  318. clearInterval(fetchMembersInterval)
  319. }
  320.  
  321. const handleHideMembersButtonClick = () => {
  322. const modifiedAreMembersHidden = !state.areMembersHidden
  323. membersTableWrapper.hidden = modifiedAreMembersHidden
  324. updateMemory({
  325. areMembersHidden: modifiedAreMembersHidden
  326. })
  327.  
  328. if(modifiedAreMembersHidden){
  329. stopMembersFetching()
  330. hideMembersButton.textContent = 'Rozwiń'
  331. return
  332. }
  333.  
  334. startMembersFetching()
  335. hideMembersButton.textContent = 'Zwiń'
  336. }
  337.  
  338. hideMembersButton.addEventListener('click', handleHideMembersButtonClick)
  339.  
  340. const getDoggoImage = () => {
  341. const doggo = new Image
  342. doggo.src = 'https://i.imgur.com/jti8ksH.png'
  343. doggo.style.width = '100%'
  344. return doggo
  345. }
  346.  
  347. const loadQueuePush = fn => {
  348. if(Engine.allInit){
  349. fn()
  350. return
  351. }
  352.  
  353. setTimeout(loadQueuePush, 2000, fn)
  354. }
  355.  
  356. loadQueuePush(() => {
  357. if(!hero.clan)
  358. return
  359.  
  360. if(state.areMembersHidden || startMembersFetching(),
  361. hero.clan.id === 13757 &&
  362. Engine.worldName === 'hutena')
  363. container.replaceChild(getDoggoImage(), title)
  364.  
  365. document.body.appendChild(container)
  366. })
  367.  
  368. })(window.Engine, window.Engine.hero.d, window.$)
Add Comment
Please, Sign In to add comment