Mail.ru api

Части и запчасти к проектам, дополнительное программное обеспечение.

Re: Mail.ru api

Сообщение proton667 05 окт 2013, 15:10

Я не очень разбираюсь - короче когда только одну фиксированную сумму каждый месяц платят.
Скрытый текст:
но вино будет
.
proton667
UNIт
 
Сообщения: 144
Зарегистрирован: 20 июл 2013, 12:40

Re: Mail.ru api

Сообщение Diab10 05 окт 2013, 15:28

proton667 писал(а):Я не очень разбираюсь - короче когда только одну фиксированную сумму каждый месяц платят.


Ну это ЕНВД. Она не для всех видов деятельности разрешена, и в каждом регионе свои правила для этого.
К примеру, торгаши на базаре работают по ЕНВД, платят фиксированную сумму. Дальнобойщики тоже по упрощёнке.
Я когда интернет-магизин одежды открывал, регал ИП. Мне не разрешили по ЕНВД работать. Платил процент с дохода.
Обычным физическим магазинам тоже по ЕНВД нельзя работать - они процент платят
Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023

Re: Mail.ru api

Сообщение proton667 05 окт 2013, 16:27

Вобшем по этому вопросу - я постараюсь подать свою игру на модерацию- я конечно не ручаюсь. У меня тоже не будет монетизации, но сделаю использование апи по получению имени. И посмотрим че они мне скажут.
А еше Николай, добавь группу технической поддержки игры, если у тебя ее нет. Я где то читал что без группы поддержки не принимают.
Последний раз редактировалось proton667 06 окт 2013, 14:39, всего редактировалось 2 раз(а).
Скрытый текст:
но вино будет
.
proton667
UNIт
 
Сообщения: 144
Зарегистрирован: 20 июл 2013, 12:40

Re: Mail.ru api

Сообщение Woolf 05 окт 2013, 16:39

proton667 писал(а):to Nicloay спасибо.
Я в ОК писал, они сказали, что нужно быть хотя бы ИП


Но я читал правила для размещения игры в ОК там четко сказано что ЧП также может заключить с ними договор. Ну вобщем не юр лицо и без упрощенки может. А им подача справки из налоговой надо всего 1 раз в год - то есть на ОК.



Бред какой-то.. С какого банана вы должны какой-то левой конторе представлять справку о ваших доходах? Ладно я еще могу понять посольство другой страны, там понятно, вы получаете их визу и им важно знать, что вы не нищий. Могу понять банк - он вам деньги доверяет. Но что мне доверяет майлру? Никогда не уважал эту контору, моё мнение подтверждается.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Mail.ru api

Сообщение Nicloay 05 окт 2013, 20:44

proton667 писал(а):Вобшем по этому вопросу - я постараюсь подать свою игру на модерацию- я конечно не ручаюсь. У меня тоже не будет монетизации, но сделаю использование апи по получению имени. И посмотрим че они мне скажут. игра не зомби - другая.
А еше Николай, добавь группу технической поддержки игры, если у тебя ее нет. Я где то читал что без группы поддержки не принимают.

Да. Группа есть. Там же на my.mail.ru
If you wish to make an apple pie from scratch, you must first invent the universe.(Carl Sagan, Cosmos)
| My Asset Store | coloring book | github | _wiki.unity3d.com | twitter | linkedin |
Аватара пользователя
Nicloay
Адепт
 
Сообщения: 1288
Зарегистрирован: 31 май 2012, 09:27
Откуда: Альпс
  • Сайт

Re: Mail.ru api

Сообщение proton667 06 окт 2013, 12:47

А не подскажешь еще как обратиться mailru.session http://api.mail.ru/docs/guides/jsapi/ чтобы получить oid и sig то есть ай ди игрока и пароль. Но не из юнити - а из джава скрипт на веб странице это можно сделать? Или это надо делать только на php? http://api.mail.ru/docs/guides/restapi/#session

Или я чего то непонимаю и ай ди получается только методом с этой страницы http://appsmail.ru/platform/mail/ivanov

Или обратиться к сессии и получить по колбеку

Вот ты же например в юнити обращался к id игрока маила - но я там че то этой строчки не нашел.
А вот нашел в скрипте MRUConthroller обращения Application.ExternalEval(eval);....надо найти где там ай ди....там же все оптимизировано я так понял параметры все скопом принимаются....
В скрипте CallBackPool функция void initHtmlJS ()...
Синтаксис:
Используется csharp
void initHtmlJS ()
        {
                string commandStringify = @"
                        JSON.stringify = JSON.stringify || function (obj) {
                            var t = typeof (obj);
                            if (t != "
"object"" || obj === null) {
                                // simple data type
                                if (t == "
"string"") obj = '""'+obj+'""';
                                return String(obj);
                            }
                            else {
                                // recurse array or object
                                var n, v, json = <img src="
./images/smilies/unmarked.gif" alt="[]" title="Запланировано" />, arr = (obj && obj.constructor == Array);
                                for (n in obj) {
                                    v = obj[n]; t = typeof(v);
                                    if (t == "
"string"") v = '""'+v+'""';
                                    else if (t == "
"object"" && v !== null) v = JSON.stringify(v);
                                    json.push((arr ? "
""" : '""' + n + '"":') + String(v));
                                }
                                return (arr ? "
"["" : ""{"") + String(json) + (arr ? ""]"" : ""}"");
                            }
                        };                     
                "
;
       
                string commandCallback = @"
                        function callback(id, obj){
                                var result=new Object();
                                result.id=id;
                                result.object=obj;
                                var resultString=JSON.stringify(result);                               
                                u.getUnity().SendMessage('OBJECT_NAME','callbackHandler',resultString);                        
                        }                      
                "
.Replace("OBJECT_NAME",gameObject.name);      
               
                string commandUpdateCallbackId = @"
                        function updateCallbackId(callbackId, mailruEventId){
                                var result=new Object();
                                result.callbackId=callbackId;
                                result.mailruEventId=mailruEventId;
                                var resultString=JSON.stringify(result);
                                console.log('sending ids to callback'+callbackId+'  mruId'+mailruEventId);
                                u.getUnity().SendMessage('OBJECT_NAME','setMailruEventId',resultString);
                        }
                       
                        "
.Replace("OBJECT_NAME",gameObject.name);
                               
                Application.ExternalEval(commandStringify);
                Application.ExternalEval(commandCallback);
                Application.ExternalEval(commandUpdateCallbackId);
        }
 

Но чесно говоря отсюда я не понял что за функция commandStringify и что за параметр тут obj function callback(id, obj){
Думаю что параметр obj это приходящий при вызове callbacka
Скрытый текст:
Объект, в котором хранятся данные о сессии. Становится доступным после вызова mailru.app.init или mailru.connect.init

{
app_id: "464119", // id вашего приложения
exp: "1273243245", // срок действия сессии
ext_perm: "notifications", // разрешения, данные пользователем вашему приложению
is_app_user: "1", // установлено ли у пользователя приложение
// 1 - установлено, 0 - не установлено

oid: "1324730981306483817", // id пользователя
session_key: "28ec5ee94bb0fdd90e0a86b19317d860", // идентификатор сессии
sig: "00c2bf2d9ec6334b92f3856351c6dd1a", // подпись запроса, настоятельно
// рекомендуем ее проверять на сервере при
// использовании данных для авторизации

ss: "d41d8cd98f00b204e9800998ecf8427e", // не используется
state: "", // не используется
vid: "1324730981306483817" // id текущего пользователя, который вы можете
// использовать для авторизации
}
Последний раз редактировалось proton667 06 окт 2013, 14:09, всего редактировалось 2 раз(а).
Скрытый текст:
но вино будет
.
proton667
UNIт
 
Сообщения: 144
Зарегистрирован: 20 июл 2013, 12:40

Re: Mail.ru api

Сообщение Nicloay 06 окт 2013, 13:52

proton667, потерпи пару часов, сейчас я добавлю функционала, я не работал до этого ст акими функциями сейчас core допилю и скину тебе пример.
If you wish to make an apple pie from scratch, you must first invent the universe.(Carl Sagan, Cosmos)
| My Asset Store | coloring book | github | _wiki.unity3d.com | twitter | linkedin |
Аватара пользователя
Nicloay
Адепт
 
Сообщения: 1288
Зарегистрирован: 31 май 2012, 09:27
Откуда: Альпс
  • Сайт

Re: Mail.ru api

Сообщение proton667 06 окт 2013, 13:54

Не не - я не спешу.
Скрытый текст:
но вино будет
.
proton667
UNIт
 
Сообщения: 144
Зарегистрирован: 20 июл 2013, 12:40

Re: Mail.ru api

Сообщение Nicloay 06 окт 2013, 15:52

Благодарствую за указание на данную функцию, пофиксил core api.
текущую версию можно взять тут https://github.com/nicloay/unity2mailru ... itypackage (обновлена)
все релизы доступны тут https://github.com/nicloay/unity2mailru/releases

Теперь по поводу GetInfo.
В самом пакете Можно найти класс GetUserInfo который занимается именно тем что спрашивал, немного объясню код
Синтаксис:
Используется csharp
        void getUserInfo(){
                // потому как найти uid на странице довольно сложно (только лишь чтоб захардкодить занчения пользователей
                // именно в этом методе (в бою этих вопросов не возникнет, ты их хоть из базы данных можешь взять) , используем getExtended  функцию которая вернет нам наших друзей.
                // (обрати внимания, что параметры функции передаются после колбака
                // так же учти что MRUController  уже должен быть проинициализирован (можешь выставить autoInit для GO  к которому приаттачишь MRUController
                MRUController.instance.callMailruByCallbackAndParams("mailru.common.friends.getExtended",delegate(object arg1, Callback arg2) {                
                        // Нам вот вернулся объект arg1 который список наших друзей и arg2  в данном случае не нужен,
                        // он используется в местах где создается перманентный коллбак, и который нужно убивать
                        // например для http://api.mail.ru/docs/reference/js/ph ... eatealbum/  нужен колбак mailru.common.events.createAlbum
                        List<object> result = arg1 as List<object>;
                        List<object> paramsForGetInfoFunction = new List<object>();
                        // здесь пройдемся по пришедшему списку и соберем uid в параметр который позже передадим в  getInfo
                        foreach(object user in result){
                                Dictionary<string,object> userObject = user as Dictionary<string,object>;
                                string uid = (string)userObject["uid"];
                                Debug2.LogDebug("found uid = "+uid);
                                paramsForGetInfoFunction.Add(uid);                             
                        }
                        // вот тут мы позовем нашу функцию с параметром (который опять же после объявления колбака
                        // эта функция вернет нам тоже самое что и предыдущая, список юзеров, можешь глянуть выше
                        // как взять любые пришедшие данные (нужно сначала скастить к листу,  и потом каждый item  к Dictionary
                        MRUController.instance.callMailruByCallbackAndParams("mailru.common.users.getInfo",delegate(object infoObj, Callback infoCallback) {
                                //ну а это стандартная практика когда не уверен, что пришло, можно вывести результат в консоль ( Debgug2  выведет это также в javascript консоль)   
                                Debug2.LogDebug("user info  ==== \n"+Json.Serialize(infoObj));                         
                        },paramsForGetInfoFunction);                   
                },"",0);               
        }
 



Если что то не понятно, или нашел ошибку в коде, дай знать, я поправлю.
If you wish to make an apple pie from scratch, you must first invent the universe.(Carl Sagan, Cosmos)
| My Asset Store | coloring book | github | _wiki.unity3d.com | twitter | linkedin |
Аватара пользователя
Nicloay
Адепт
 
Сообщения: 1288
Зарегистрирован: 31 май 2012, 09:27
Откуда: Альпс
  • Сайт

Re: Mail.ru api

Сообщение Nicloay 06 окт 2013, 16:28

По заявкам трудящихся выкладываю версию beta2.1
https://github.com/nicloay/unity2mailru ... itypackage
Единственное отличие это сохранение mailru.session в контроллере после инициализации.

Кстати давайте расскажу про инициализацию
Самый простой способ это добавить Скрипт MRUController к гейм обжекту и выставить настройку initOnStart
Изображение
В ином случае можно инициализировать контроллер в любое время (или например как в моем случае при условии, для vkontakte один контроллер для mailru другой для остальных третий)
Синтаксис:
Используется csharp
//если мы хотим знать когда именно готов mailru api можно подписаться на событие (не обязательно)
MRUController.instance.onApiReady += onApiReadyListener; // в этот метод к нам придет объект с mailru.session
MRUController.instance.initializeMailRuApi();
....
// гдето в другом методе
// после того как апи проинициализировалось в MRUController.instance.mailruSession будут доступны данные о сессии это dictionary, поэтому чтоб узнать oid  пользователя мы можем позвать
string userId = (string) MRUController.instance.mailruSession["oid"];
 
If you wish to make an apple pie from scratch, you must first invent the universe.(Carl Sagan, Cosmos)
| My Asset Store | coloring book | github | _wiki.unity3d.com | twitter | linkedin |
Аватара пользователя
Nicloay
Адепт
 
Сообщения: 1288
Зарегистрирован: 31 май 2012, 09:27
Откуда: Альпс
  • Сайт

Re: Mail.ru api

Сообщение proton667 06 окт 2013, 16:55

Спасибо.
Получение id и имени игрока mail ru
Ну а я вобщем отвечу на свой же вопрос для тех кто так же понимает в программировании как и я. Получаем id вообще просто. Короче написано что присылает он такой ответ на инициализации: mailru.session http://api.mail.ru/docs/guides/jsapi/#receiver
Становится доступным после вызова mailru.app.init
значит обращаемся просто к переменной mailru.session.oid
А затем в функции function func() используем метод http://api.mail.ru/docs/reference/js/users-getinfo/ для получения имени по нажатию кнопки наме. Кстати он инфу по номеру 123 как у них в примере не выводит. Такого id в их базе нет. Так что ставьте лучше в пример свой id.
Синтаксис:
Используется javascript
 <html>
      <head>
        <script type="text/javascript" src="http://cdn.connect.mail.ru/js/loader.js">
        </script>
      </head>
      <body>
        <script type="text/javascript">
           mailru.loader.require('api', function() {
               mailru.app.init('Ваш Приватный ключ');
                   
                //выведет id mail.ru  пользователя
                   alert(mailru.session.oid);
               // все готово, здесь можно работать с функциями API

                   
           });

           //show the name of users by typing button "name"  

                function func() {

                   mailru.common.users.getInfo(function(user_list) {
                         alert(user_list[0].first_name); // выведет имя пользователя с uid 123
                     }, '8878293280924612299');

               }

        </script>


           <input type="button" onclick="func()" value="name"/>


      </body>
    </html>
 
 

И конечно как сказано на этой странице зальете файл receiver.html в папку с билдом и в настройках приложения укажете к нему путь.
А получение пасворда также берется из маил сешн. Там же есть переменная mailru.session.sig

Вот моя веб страница имеет такой вид - передает id, password und name игрока маила
(хотя может имело смысл вызвать ее из тега боди перед выполнением юнити веб плеера)

Синтаксис:
Используется javascript
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
        <head>
                <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
                <title>Unity Web Player | CorruptionStrike</title>
                <script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js'></script>
                <script type="text/javascript">
                <!--
                var unityObjectUrl = "http://webplayer.unity3d.com/download_webplayer-3.x/3.0/uo/UnityObject2.js";
                if (document.location.protocol == 'https:')
                        unityObjectUrl = unityObjectUrl.replace("http://", "https://ssl-");
                document.write('<script type="text\/javascript" src="' + unityObjectUrl + '"><\/script>');
                -->
                </script>


 <script type="text/javascript" src="http://cdn.connect.mail.ru/js/loader.js">
        </script>
      </head>
     
       <script type="text/javascript">
          var u = new UnityObject2();
          u.initPlugin(jQuery("#unityPlayer")[0], "game.unity3d");         //тут имя вашего билда
          var viewer_id;
          var auth_key;
            var user_name;

           mailru.loader.require('api', function() {
               mailru.app.init('Приватный ключ');
                   
                   viewer_id = mailru.session.oid;
                   
                   alert(viewer_id);
                 
                   auth_key = mailru.session.sig;
               // все готово, здесь можно работать с функциями API
                   alert(auth_key);
                 
                    u.getUnity().SendMessage("Status", "sendid", viewer_id);
                   u.getUnity().SendMessage("Status", "sendpass", auth_key);

                   

                   
           });

             

                function getid(par) {                     //эту функцию я вызываю на старте из юнити

                   mailru.common.users.getInfo(function(user_list) {
                      user_name = user_list[0].first_name; // выведет имя пользователя с uid 123
                                               
                          alert(user_name);
                             u.getUnity().SendMessage("Status", "sendfirst", user_name);

                          }, viewer_id);

                   

               }

         
          //u.getUnity().SendMessage("Status", "sendid", viewer_id);
          //u.getUnity().SendMessage("Status", "sendpass", auth_key);
           // u.getUnity().SendMessage("Status", "sendfirst", user_name);


        </script>








                <script type="text/javascript">
                <!--
                        var config = {
                                width: 850,
                                height: 610,
                                params: { enableDebugging:"0" }
                               
                        };
                        config.params["disableContextMenu"] = true;
                        var u = new UnityObject2(config);
                       
                        jQuery(function() {

                                var $missingScreen = jQuery("#unityPlayer").find(".missing");
                                var $brokenScreen = jQuery("#unityPlayer").find(".broken");
                                $missingScreen.hide();
                                $brokenScreen.hide();

                                u.observeProgress(function (progress) {
                                        switch(progress.pluginStatus) {
                                                case "broken":
                                                        $brokenScreen.find("a").click(function (e) {
                                                                e.stopPropagation();
                                                                e.preventDefault();
                                                                u.installPlugin();
                                                                return false;
                                                        });
                                                        $brokenScreen.show();
                                                break;
                                                case "missing":
                                                        $missingScreen.find("a").click(function (e) {
                                                                e.stopPropagation();
                                                                e.preventDefault();
                                                                u.installPlugin();
                                                                return false;
                                                        });
                                                        $missingScreen.show();
                                                break;
                                                case "installed":
                                                        $missingScreen.remove();
                                                break;
                                                case "first":
                                                break;
                                        }
                                });
                                u.initPlugin(jQuery("#unityPlayer")[0], "_djey.unity3d");
                        });
                -->
                </script>
                <style type="text/css">
                <!--
                body {
                        font-family: Helvetica, Verdana, Arial, sans-serif;
                        background-color: white;
                        color: black;
                        text-align: center;
                }
                a:link, a:visited {
                        color: #000;
                }
                a:active, a:hover {
                        color: #666;
                }
                p.header {
                        font-size: small;
                }
                p.header span {
                        font-weight: bold;
                }
                p.footer {
                        font-size: x-small;
                }
                div.content {
                        margin: auto;
                        width: 850px;
                }
                div.broken,
                div.missing {
                        margin: auto;
                        position: relative;
                        top: 50%;
                        width: 193px;
                }
                div.broken a,
                div.missing a {
                        height: 63px;
                        position: relative;
                        top: -31px;
                }
                div.broken img,
                div.missing img {
                        border-width: 0px;
                }
                div.broken {
                        display: none;
                }
                div#unityPlayer {
                        cursor: default;
                        height: 610px;
                        width: 850px;
                }
                -->
                </style>
        </head>
        <body>
                <p class="header"><span>Unity Web Player | </span>CorruptionStrike</p>
                <div class="content">
                        <div id="unityPlayer">
                                <div class="missing">
                                        <a href="http://unity3d.com/webplayer/" title="Unity Web Player. Install now!">
                                                <img alt="Unity Web Player. Install now!" src="http://webplayer.unity3d.com/installation/getunity.png" width="193" height="63" />
                                        </a>
                                </div>
                        </div>
                </div>
                <p class="footer">&laquo; created with <a href="http://unity3d.com/unity/" title="Go to unity3d.com">Unity</a> &raquo;</p>
        </body>
</html>



 
Последний раз редактировалось proton667 08 окт 2013, 12:35, всего редактировалось 1 раз.
Скрытый текст:
но вино будет
.
proton667
UNIт
 
Сообщения: 144
Зарегистрирован: 20 июл 2013, 12:40

Re: Mail.ru api

Сообщение Nicloay 07 окт 2013, 19:33

Пару дней назад попробовал добавить приложение в "публичное" тоесть, без публикации в каталоге.
Пришел стандартный ответ.

Комментарии модератора: создайте компанию и акцептуйте оферту
apiok.ru


Информации о том какую нужно компанию на сайте api.mail.ru или my.mail.ru или в панели администрирования приложения, нигде не найти.
На письма отосланные на app@corp.mail.ru они не отвечают.

Сегодня создал тикет на http://dev.odnoklassniki.ru/jira/ , может там хоть какую либо информацию удасться получить. Хотя мне уже что то кажется что на мой мир без ИП не попасть, и нужна таже морока что и для однокласников.

Так же задал вопрос в сообществе разработчиков http://my.mail.ru/community/myplatform/ ... 69D90.html , но там что то ситуация когда вопросов гораздо больше чем ответов.
If you wish to make an apple pie from scratch, you must first invent the universe.(Carl Sagan, Cosmos)
| My Asset Store | coloring book | github | _wiki.unity3d.com | twitter | linkedin |
Аватара пользователя
Nicloay
Адепт
 
Сообщения: 1288
Зарегистрирован: 31 май 2012, 09:27
Откуда: Альпс
  • Сайт

Re: Mail.ru api

Сообщение proton667 07 окт 2013, 19:49

Николай, может быть я не прав, но я предельно ясно понимаю в чем дело. Ты же видел там есть раздел билинг и там есть пункт создать компанию и там еше окно для ввода адреса к скрипту платежей. То есть это вкладка для настройки платежей в игре. А по правилам платжеи нельзя интегрировать в игру без заключения договора с Ок. Вот я лично на ОК регился и все условия про договор читал. Это то где я расписывал какие справки о ЧП им надо подать. И я так понимаю что они тебя направляют на эту страничку - чтобы ты заключал договор с ОК, они же маил ру. Если ты не знаешь где инфа про договора в Ок я могу тебе показать - хотя возможно для этого понадобиться обязательная рега в ОК. Там страничка где подробно расписан список документов предоставляемых в ОК.
Последний раз редактировалось proton667 07 окт 2013, 19:52, всего редактировалось 1 раз.
Скрытый текст:
но вино будет
.
proton667
UNIт
 
Сообщения: 144
Зарегистрирован: 20 июл 2013, 12:40

Re: Mail.ru api

Сообщение Nicloay 07 окт 2013, 19:51

Причем тут билинг, если у меня нет никакой монетизации..
в таргет.майл.ру же они никаких документов не требуют. Да и в условиях публикации нигде об этом не слово.
Я когда начал заниматься этой темой, прочитал пачку разных тредов, в некоторых местах видел что много народу на ОК не попадают как раз из за ИП и прочего, а в майл ру с этим все проще (по крайне мере раньше было)
If you wish to make an apple pie from scratch, you must first invent the universe.(Carl Sagan, Cosmos)
| My Asset Store | coloring book | github | _wiki.unity3d.com | twitter | linkedin |
Аватара пользователя
Nicloay
Адепт
 
Сообщения: 1288
Зарегистрирован: 31 май 2012, 09:27
Откуда: Альпс
  • Сайт

Re: Mail.ru api

Сообщение proton667 07 окт 2013, 19:54

Возможно я ошибаюсь. Просто у меня в голове это слово оферта - это именно та страничка на OK где заключают договор. Ну я могу поискать эту страницу просто лень - наверное даже найду. Что такое тогда по твоему оферта apiok - договор это с ОК - не что иное - имхо

нашел - вот как по твоему - это не оно? http://apiok.ru/wiki/pages/viewpage.act ... d=42476501
Последний раз редактировалось proton667 07 окт 2013, 20:05, всего редактировалось 1 раз.
Скрытый текст:
но вино будет
.
proton667
UNIт
 
Сообщения: 144
Зарегистрирован: 20 июл 2013, 12:40

Пред.След.

Вернуться в Компоненты (Копилка)

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1