stuppid_bot

Untitled

Jan 30th, 2016
282
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // event-emitter.js
  2. // Позволяет создавать свои события типа:
  3. // thisModel.emit('login.fail', obj)
  4. // И отлавливаем:
  5. // thisController.model.on('login.fail', function(error) {
  6. //   *Выводим на экран ошибку*
  7. // })
  8. function EventEmitter() {
  9.   this.__listeners = {};
  10. }
  11.  
  12. function EventListener(fn, scope, once) {
  13.   this.fn = fn;
  14.   this.scope = scope;
  15.   this.once = once;
  16. }
  17.  
  18. EventEmitter.prototype = {
  19.   /* Вызывает fn в контексте scope при возникновении события type. Если
  20.    * once == true, то выполнится всего один раз.
  21.    */
  22.   on: function(type, fn, scope, once) {
  23.     var index = this.__indexOf(type, fn);
  24.     if (index != -1) {
  25.       // Если обработчик уже задан, то обновляем scope и once для слушателя
  26.       var listener = this.__listeners[type][index];
  27.       listener.scope = scope;
  28.       listener.once = once;
  29.     } else {
  30.       var listeners = this.__listeners[type] || (this.__listeners[type] = []);
  31.       // Добавляем нового слушателя
  32.       var listener = new EventListener(fn, scope, once);
  33.       listeners.push(listener);
  34.     }
  35.     return this;
  36.   },
  37.   /* Вызывает fn в контексте scope при возникновении события type один раз. */
  38.   once: function(type, fn, scope) {
  39.     return this.on(type, fn, scope, true);
  40.   },
  41.   /* Удаляет всех слушателей, либо удаляет слушателей для события type, либо
  42.    * удаляет слушателя с обработчиком fn для события type.
  43.    */
  44.   off: function(type, fn) {
  45.     if (!arguments.length) {
  46.       // .off() - удаляем всех слушателей
  47.       this.__listeners = {};
  48.     } else if (arguments.length == 1) {
  49.       // .off(type) - удаляем слушателей для события type
  50.       if (this.__listeners.hasOwnProperty(type)) {
  51.         delete this.__listeners[type];
  52.       }
  53.     } else {
  54.       // .off(type, fn) - удаляем слушателя для события type с обработчиком fn
  55.       var index = this.__indexOf(type, fn);
  56.       if (index != -1) {
  57.         // Удаляем обработчик
  58.         this.__listeners[type].splice(index, 1);
  59.         if (!this.__listeners[type].length) {
  60.           // Если массив слушателей пуст, то удаляем свойство с именем type
  61.           delete this.__listeners[type];
  62.         }
  63.       }
  64.     }
  65.     return this;
  66.   },
  67.   /* Генерирует событие type и вызывает их обработчики. В функцию обработчик
  68.    * передаются аргументы после type.
  69.    */
  70.   emit: function(type, args) {
  71.     if (!this.__listeners.hasOwnProperty(type)) {
  72.       return;
  73.     }
  74.     args = [].slice.call(arguments, 1);
  75.     var i = 0;
  76.     var listeners = this.__listeners[type];
  77.     while (i < listeners.length) {
  78.       var listener = listeners[i];
  79.       listener.fn.apply(listener.scope || this, args);
  80.       if (listener.once) {
  81.         // Если обработчик должен выполниться лишь один раз, то удаляем
  82.         // слушателя
  83.         listeners.splice(i, 1);
  84.       } else {
  85.         ++i;
  86.       }
  87.     }
  88.     if (!listeners.length) {
  89.       // Если массив слушателей пуст, то удаляем свойство с именем type
  90.       delete this.__listeners[type];
  91.     }
  92.   },
  93.   __indexOf: function(type, fn) {
  94.     if (this.__listeners.hasOwnProperty(type)) {
  95.       var listeners = this.__listeners[type];
  96.       var i = listeners.length;
  97.       while (i--) {
  98.         if (listeners[i].fn === fn) {
  99.           return i;
  100.         }
  101.       }
  102.     }
  103.     return -1;
  104.   }
  105. };
  106.  
  107. EventEmitter.mixin = function(obj) {
  108.   if (typeof obj == "function") {
  109.     obj = obj.prototype;
  110.   }
  111.   var proto = new EventEmitter();
  112.   for (var i in proto) {
  113.     obj[i] = proto[i];
  114.   }
  115.   return obj;
  116. };
  117.  
  118. var testEvents = {};
  119. EventEmitter.mixin(testEvents);
  120. // End event-emitter.js
  121. // =============================================================================
  122. // http.js
  123. // Набор функций для работы с сетью
  124. // .import "http.js" as http
  125. function encodeQueryParameters(parameters) {
  126.   var pairs = [];
  127.   for (var i in parameters) {
  128.     if (parameters.hasOwnProperty(i)) {
  129.       var name = encodeURIComponent(i);
  130.       var value = encodeURIComponent(parameters[i]);
  131.       pairs.push(name + '=' + value);
  132.     }
  133.   }
  134.   return pairs.join('&');
  135. }
  136.  
  137. function parseQueryString(str) {
  138.   var pairs = str.split("&");
  139.   var ret = {};
  140.   for (var i = 0; i < pairs.length; ++i) {
  141.     var pair = pairs[i].split('=', 2);
  142.     var name = decodeURIComponent(pair[0]);
  143.     var value = pair.length == 2 ? decodeURIComponent(pair[1]) : '';
  144.     ret[name] = value;
  145.   }
  146.   return ret;
  147. }
  148.  
  149. function request(method, url, callback, headers, data) {
  150.   var xhr = new XMLHttpRequest();
  151.   xhr.open(method, url);
  152.   xhr.onload = function() {
  153.     if (typeof callback == "function") {
  154.       try {
  155.         xhr.responseJSON = JSON.parse(xhr.responseText);
  156.       } catch (e) {}
  157.       var data = xhr.responseJSON || xhr.responseText;
  158.       callback(data, xhr.status, xhr);
  159.     }
  160.   };
  161.   if ({}.toString.call(headers) == "[object Object]") {
  162.     for (var i in headers) {
  163.       if (headers.hasOwnProperty(i)) {
  164.           xhr.setRequestHeader(i, headers[i]);
  165.       }
  166.     }
  167.   }
  168.   xhr.send(data);
  169. }
  170.  
  171. function get(url, callback, parameters, headers) {
  172.   if ({}.toString.call(parameters) == "[object Object]") {
  173.     parameters = encodeQueryParameters(parameters);
  174.     url += (url.indexOf('?') == -1 ? '?' : '&') + parameters;
  175.   }
  176.   request('GET', url, callback, headers);
  177. }
  178.  
  179. function post(url, callback, data, headers) {
  180.   if ({}.toString.call(data) == "[object Object]") {
  181.     data = encodeQueryParameters(data);
  182.     headers = headers || {};
  183.     // Если content-type уже задан, то его значение будет выглядеть как:
  184.     // <someshit>, application/x-www-form-urlencoded
  185.     headers["Content-Type"] = "application/x-www-form-urlencoded";
  186.   }
  187.   request('POST', url, callback, headers, data);
  188. }
  189.  
  190. // tests
  191. // Open link <https://httpbin.org> and run this code in the console
  192. get('/get?foo', function(data) {
  193.   console.log(data.args);
  194. }, {bar: 'quix'});
  195.  
  196. post("/post", function(data, status, xhr) {
  197.   console.log(data.form);
  198. }, {foo: 'bar'});
  199. // End http.js
  200. // =============================================================================
  201.  
  202. function clone(obj) {
  203.   return JSON.parse(JSON.stringify(obj));
  204. }
  205.  
  206. // =============================================================================
  207. // Минимальная реализация работы с Api Вконтакте. Для примера.
  208. var API_VERSION = 5.44;
  209. var API_URL = "https://api.vk.com/method";
  210. var AUTH_URL = "https://oauth.vk.com/token";
  211. var CLIENT_ID = 2274003;
  212. var CLIENT_SECRET = "hHbZxrka2uZ6jB1inYsH";
  213.  
  214.  
  215. function VkAuthentcation(vkApi) {
  216.   this._vkApi = vkApi;
  217.   this._captchaSid = null;
  218. }
  219.  
  220. VkAuthentcation.prototype = {
  221.   authenticate: function(username, password, captchaKey) {
  222.     var self = this;
  223.     var params = {
  224.       v: self._vkApi.apiVersion,
  225.       client_id: CLIENT_ID,
  226.       client_secret: CLIENT_SECRET,
  227.       grant_type: "password",
  228.       username: username,
  229.       password: password
  230.     };
  231.     if (captchaKey) {
  232.       params['captcha_key'] = captchaKey;
  233.       params['captcha_sid'] = this._captchaSid;
  234.     }
  235.     get(AUTH_URL, function(response) {
  236.       console.log(response);
  237.       if (response.error) {
  238.         if (response.error == 'need_captcha') {
  239.           this._captchaSid = response.captcha_sid;
  240.           self.emit('captcha', response.captcha_img);
  241.           return;
  242.         }
  243.         self.emit("error", response);
  244.         return;
  245.       }
  246.       self._vkApi.accessToken = response.access_token;
  247.       self._vkApi.userId = response.user_id;
  248.       // там еще expires_in остался, но он равен 0 для офиц. приложений
  249.       self.emit("success");
  250.     }, params)
  251.   }, // end authenticate
  252. };
  253.  
  254. EventEmitter.mixin(VkAuthentcation);
  255.  
  256.  
  257. function VkApi(accessToken, userId, apiVersion) {
  258.   this.accessToken = accessToken;
  259.   this.userId = userId;
  260.   this.apiVersion = apiVersion || API_VERSION;
  261. }
  262.  
  263. VkApi.prototype = {
  264.   /* Вызывает метод Api */
  265.   apiCall: function(method, callback, params, delay) {
  266.     // foo/bar -> foo/bar/
  267.     var self = this;
  268.     var endpoint = API_URL.replace(/(\/|)$/, '/') + method;
  269.     setTimeout(function() {
  270.       post(endpoint, function(data, status, xhr) {
  271.         callback(data.error, data.response);
  272.       }, params);
  273.     }, delay);
  274.   }, // end apiCall
  275. };
  276.  
  277. // Добавляем события
  278. EventEmitter.mixin(VkApi);
  279.  
  280. var vkApi = new VkApi();
  281. var vkAuthentcation = new VkAuthentcation(vkApi);
  282.  
  283. vkAuthentcation.on('captcha', function(url) {
  284.   console.log("Captcha URL: %s", url);
  285. });
  286.  
  287. vkAuthentcation.on('error', function(response) {
  288.   console.warn("%s: %s", response.error, response.error_description);
  289. });
  290.  
  291. vkAuthentcation.authenticate(1, 1);
Advertisement
Add Comment
Please, Sign In to add comment