Перейти к содержанию

Mangol

Постоялец
  • Публикаций

    205
  • Зарегистрирован

  • Посещение

  • Победитель дней

    1
  • Отзывы

    0%

Сообщения, опубликованные Mangol


  1. Цитата

    3. После наложения печати в итеме должна дописываться информация (как дописывается информация о ЛСе), о том, что вещь принадлежит клану "ClanName"

    Все рассуждают как бы они сделали, но упустили главный пункт.
    Может кто-то расскажет про 3-ий пункт ?)

    • Haha 1
    • Upvote 2

  2. Каждому из нас нравится, когда мы ощущаем себя комфортно, а все, что нам нужно, находится под рукой и нет необходимости совершать лишние действия для реализации наших потребностей. Именно это и стало главной идеей на старте разработки - удобно, доступно, качественно.

    Подавляющее большинство людей пользуются мессенджерами, в особенности Telegram, популярность которого растет с каждым днем. Поэтому цель для внедрения была определена довольно быстро.

     

    Что же из себя представляет данный бот - @MMOAnnounceBot. На текущий момент главной его функцией является выполнение роли анонсера игровых проектов. Анонсер в виде бота в мессенджере это несомненно удобнее, нежели аналогичные сервисы, которые предоставляют такие же услуги на своих сайтах. Нет надобности заходить из своих браузеров на сайты, часть из которых все еще не адаптирована под мобильные устройства, что порой значительно сказывается на удобстве использования сервиса, если нет прямого доступа к ПК. В то же время Telegram есть практически у каждого и в смартфоне и на ПК (речь не о веб-версии :sick:, а об отдельном приложении). А это значит, что вы в любое время и в любом месте можете воспользоваться услугами этого бота.

     

    Каждый пользователь имеет возможности найти подходящий для себя проект из общего списка или использовать поиск по определенным критериям. Помимо этого, проекты, которые заинтересовали пользователя, можно добавить в личный список Избранного и получать уведомления о предстоящем открытии. Подробнее об уведомлениях и их настройках будет рассказано далее.

     

    Владельцы проектов могут разместить свой собственный анонс, предоставив краткую информацию о проекте. В ходе создания анонса пользователя сопровождают подсказки с примерами. В случае возникновения каких-либо вопросов, можно обратиться к вспомогательной информации, которая всегда доступна пользователю, либо же отправить заявку в Техническую Поддержку, реализованной непосредственно в боте. После создания, анонс отправляется на проверку и при соблюдении правил сервиса, публикуется в общем списке. О результате проверки бот уведомит пользователя, размещающего анонс, специальным оповещением.

     

    За публикацию проекта у пользователя списывается внутренняя валюта бота, которую можно приобрести через встроенную систему платежей в Telegram. Подобная реализация позволяет достичь максимальной автоматизации процесса размещения анонсов, ведь это занимает куда меньше времени, чем переводить кому-то средства лично на счет. Такой способ проведения платежей обеспечивает безопасность личных данных, поскольку Telegram гарантирует, что никто не имеет доступа к платежной информации пользователя.

    Помимо этого сервис планирует проводить различные акции и раздачи промокодов на скидки. Также в боте есть система персональных скидок, размер которых растет в зависимости от суммарного количества приобретенной внутренней валюты.

     

    Полезная и важная информация предоставляется пользователю в разделе Справки, где собраны ответы на все основные вопросы, которые могут возникнуть во время пользования ботом. Любой пользователь может отправить свое обращение (вопрос, предложение или жалобу) в Техническую Поддержку для дальнейшей обработки. В случае необходимости персонального решения вопроса, специалист тех. поддержки свяжется с пользователем в личной беседе.

     

    Настройки позволяют пользователю установить бота под свои персональные нужды: поменять язык, настроить оповещения и т.д.

    В боте присутствует два типа оповещений: настраиваемые и автоматические.

    Настраиваемые оповещение пользователь может установить лично в настройках бота. Например, уведомления о добавлении новых анонсов проектов определенного типа.

    Автоматические оповещения уже настроены заранее разработчиками. Например, напоминания о предстоящем открытии проекта из списка Избранного пользователя или напоминания для владельца проекта о подходящем к концу сроку размещения анонса.

    Спойлер
    Спойлер

    glGSEBqERLi2AvhbQVjUFg.png

    Спойлер

    uxVlWu8SSxa4FM99Cu70jA.png

    Спойлер

    21RrzmO9TOqP1oEjQtbbIQ.png

    Спойлер

    4ECOV2wmSBm-mHKT0Gm3dQ.png

    Спойлер

    EHPXvNnpRlW5Vl8irTbX0w.png

    Спойлер

    z8eWkIH1TKy6G03ZEAUCwA.png

    Спойлер

    gwbbbDmxTda-raXO7fLIHg.png

    Спойлер

    qfi6zKfDRrWQin03NsfTfQ.png

     

    Спойлер

    pUwhI5GYStq3urTgmARcfA.png

    Спойлер

    6ibfh-sMTSugmbuENNwpBA.png

    Спойлер

    8S_iF_ZrR7qLsAZ09GcX_Q.png

    Спойлер

    KSFXP_OjR1S_UJQcppvvxg.png

    Подробно познакомиться с ботом и полностью оценить его функционал можно непосредственно в Telegram'е: @MMOAnnounceBot

     

    Проект только начинает развиваться. Есть еще много идей и планов для реализации и улучшения сервиса. Но уже сейчас его можно использовать для рекламной кампании своего проекта.

     

    Для размещения этой темы использовался аккаунт знакомого.

    • Like 2

  3. 1 час назад, win37rus сказал:

    Возможно я ошибаюсь, но что-то мне кажется что если 1 логин сервер (сборки одинаковые) то objectid не дублируются. по крайней мере я пробежался по objectid и одинаковых не нашел!Хотя могу ошибаться

    в 90% случаев этот objid начинается как раз таки с с одного и того же числа. Так что дубликаты будут, поэтому их придется мержить выдавая новый обж ид если такой уже существует.


  4. image.png.a6291715d75a592621bf423b3b401647.png

    Очень познавательно, даже захотелось сразу закрыть тему, лучше никому не рассказывать о переводах штмл-ок, и подобного.

    Хотелось бы сразу перейти к делу, и спросить, а чем этот исходник такой особенный, чем отличается от того же лост-а или других подобных исходников которые гуляют между форумами? Что то глобальное переписали?(Думаю нет) Что то новое написали?(Думаю нет). Так о какой команде может идти речь, выехать на чужом пиструне не получится.Я более чем уверен что никто в здравом уме не будет открывать проект на данной сборке, это логично, так как любой серьезный баг, и вы сольетесь.

    P.S. Ничего не разрабатываю, конкуренцию никому не составляю.

    • Upvote 1

  5. 3 часа назад, finfan сказал:

    Можно тогда переменную counter сделать volatile и по плану всё будет нормально ;D либо синхронайз запулять там где нужно, хотя всё это - дерьмо, лучший вариант это листенер ;D

    Использование CAS(ну если прям без CAS, можно использовать double checking в нужных местах), либо синхронизация блока, либо целого метода. Т.к. чистое поле volatile тут не спасет, может 2 раза завершить евент(заодно награды выдаст ^_^ 2 раза)

     

    Цитата
    
    // определяем после counter++ есть ли победитель?
    boolean hasWinner = MAX_PLAYER - counter <= 1;
    if(hasWinner) {
    	//то завершаем эвент
    }

    Вот как раз тут.

    P.S. В чем соль слушателя? Если он возможно как раз и будет дергать этот метод.(Ну конечно исключая тот факт если слушатель не вызывается синхронно через какой то контроллер).


  6. 1 час назад, finfan сказал:

    Это просто примеры, вам надо смотреть конкретно свою реализацию.

    Вариант 1:

    
    int counter = registeredPlayers.size();
    for(Player next : registeredPlayers) {
    	if(next.isDead()) 
    		counter--;
    }
    
    if(counter <= 1) {
      //завершаем эвент
    }

     

    Вариант 2:

    
    //изначально имеем слушатель или костыль типо слушателя, который записывает данные. Лучший вариант
    
    void onPlayerDie(Player participiant) {
      // удаляем участника из листа если он отъехал
    	registeredPlayers.remove(participiant);
    	if(registeredPlayers.size() <= 1) {
         	//завершаем эвент 
        }
    }

     

    Вариант 3:

    
    // у нас в эвенте есть прееменная
    private int counter;
    
    // которая считает убитых при их смерти
    counter++;
    
    //и ещё есть максимальное кол-во участников в текущем эвенте
    private static final MAX_PLAYERS = 20;
    
    // определяем после counter++ есть ли победитель?
    boolean hasWinner = MAX_PLAYER - counter <= 1;
    if(hasWinner) {
    	//то завершаем эвент
    }

     

    Хороший Тон - Слушатель, т.к. нет особой вылазки в код. Не надо конкретно лазить в Event код чтобы менять что-то внутри его функционала.

    В 3 варианте необходимо использовать методы которые обеспечивают thread safe. Может выйти так, что смерть сразу 2-ух игроков, и один из них притянет уже старый кэш. Отсюда уже будут проблемы.


  7. 3 часа назад, Akumu сказал:

    Привет,

    Не понаслышке знаю о качестве техники от Dell, девайсы действительно хорошие, если знать в них толк. Удачи в продаже.

    У меня когда то был DELL, вполне хорошая фирма, учитывая что американцы очень часто их используют.


  8. На продажу лэптоп-трансформер (режим ноутбука / планшета). Самое оно для работы, офигительно мобильный, да еще и мощный (в случае чего можно и в игрули погонять, если делать нечего).
     
    Под капотом:
    Intel Core i5 7200U (кеби лейк)
    ОЗУ 8 гб (планки не впаяны, возможно расширение до 16гб)
    Грауфоний на ЦПУ, Intel HD Graphics 620
    Экран дефолт, для нашего времени: 1920x1080; киллерфича - тачскрин (мультитач)
    SSD 256 гб
    Размерчик 13.3 дюйма
    Порты: x3 USB, Jack, HDMI, SD
    Вес по спеке 1.7кг, взвешивал на своих весах, получилось в районе 1.2кг.
     
    В наличии один штук, коробка не вскрыта, покупался в США. Русской раскладки не имеет (можно сделать гравировку, если требуется, но тогда придется вскрыть коробку). Винда US без регионального лока (т.е. свободно ставится локализация на любой язык).
     
    Цена 60 000 деревянных с торгом, локация Москва. Писать в личку  https://forummaxi.ru/profile/13623-pointerrage/
     
    Пикчи девайса
    1.jpg
     
    2.jpg
     
    3.jpg
     
    4.jpg

     

    • Upvote 1

  9. Дафно мичтал о такой риализацыи, многа сервисав, плюшек, много чго паиграть с другами из школы. Все очинь сирьезно, под рийты х0.5 даже саитет.

     

    По теме:

     Человек пишет всем кому только не лень, оставить о нем отзыв, так вот: не стоит с данным тс иметь дел, за плечами куча команд, с разными именами, столько же возможно и клиентов осталось без поддержки.

    • Upvote 2

  10. Можно сделать более красиво - вывести суплир в отдельный класс, где и будет храниться сет уже сгенерированных псевдослучайным образом ключей, а стрим создавать через IntStream.generate

     

    Вообще, кейс немного странный. Очень редко когда нужно удалить такое большое количество случайных элементов. В основном ключи для удаления всегда предопределены (получены по сети, из базы, от юзера и так далее).

    Задача была взята из головы. Но ты единственный кто её решил, так как я задумал.


  11. Решил посмотреть хваленую сборку под дополнения, и первое что заметил, что очень быстро загружет память, где-то в около 80-100мб в минуту...через минут 5-10 работы сервера жрет уже где-то 300мб в минуту, после же происходит очистка мусора и опять все по новой.

    Просмотр осуществлен программой VisualVM.

    В профайлере показало что утечка из-за FastList и похоже что ещё Integer.

    Такой вопрос...это у PWSoft'a всегда было и это норма? или это только у меня 8)

     

    Если все 300 мб улетело. И память очистилась, это ещё не утечка. Если бы память росла, и не вылетала в мусорку, это уже совсем другое дело.

    • Upvote 1

  12. 	@[member='test']
    	public void testMangolDelete() {
    		final Object value = new Object();
    		final Map<Integer, Object> map = IntStream.range(0, 1000).boxed().collect(Collectors.toMap(k -> k, k -> value));
    		
    		ThreadLocalRandom.current().ints(ThreadLocalRandom.current().nextInt(100, 250), 0, map.size())
    			.forEach(v -> map.remove(v));
    	}
    

    ac0659372ea36c7ab393a3146436.png

     

    А как насчет того, а вдруг они будут повторятся ?

    Размер большой, по всей видимости будут повторятся. Т.е. кол-во которое зарандомайзил рандом, снится на пару процентов.

     

    http://prntscr.com/ga0ojg Реализация внутри ThreadLocalRandom


  13. Так в чем проблема написать свой рандум идов для удаления?

    Задача же была вроде как безопасное удаление с HeshMap списка, это можно сделать добавив нужные иды в keys.

    А если нужен рандум то просто переписать условие if(keys.contains()) добавив рандум. Либо создать генератор рандума для keys.

    Это уже дело фантазии.

    Просто думал может есть какой ещё лучше метод удаления с хешмапа масив с идами, то было бы интересно посмотреть.

     

    Методов куча, но вот 100-250 я не увидел реализации. А вдруг что то изменится из-за этих 100-250


  14.  

    Это же в каком законе такое прописано что перемешивать нельзя?

     

    Collections.shuffle(keys); //мешаем наш список идов

    В итоге мы просто переберем весь список(map) и сравним каждый ид с тем что есть в списке(keys) идов игроков. А затем удалим нужные иды со списка (map)

     

    		int counts = 600; 
    		
    		HashMap<Integer, String> map = new HashMap<Integer, String>();
    		ConcurrentHashMap<Integer, String> conmap = new ConcurrentHashMap<Integer, String>();
    		ArrayList<Integer> keys = new ArrayList<Integer>();
    		for(int i=1;i<=counts;i++)
    		{
    			map.put(i,"Текст "+i);
    			conmap.put(i,"Текст "+i);
    			if((i%2)==0) //все четные числа до counts
    			{
    				keys.add(i); 
    			}
    		}
    
    		//Перемешиваем
    		Collections.shuffle(keys);
    
    		//HashMap
    		long start_time = new GregorianCalendar().getTimeInMillis();
    		for(Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator(); it.hasNext(); ) 
    		{
    			Map.Entry<Integer, String> entry = it.next();
    			if(keys.contains(entry.getKey()))
    			{
    				it.remove();
    			}
    		}
    		long finish_time = new GregorianCalendar().getTimeInMillis();
    		System.out.println("Time HashMap: "+(finish_time - start_time)+"ms "+ map.size()+ "size");
    		
    		//ConcurrentHashMap
    		start_time = new GregorianCalendar().getTimeInMillis();
    		for(Map.Entry<Integer, String> it :  conmap.entrySet()) 
    		{
    			if(keys.contains(it.getKey()))
    			{
    				conmap.remove(it.getKey());
    			}
    		}
    		finish_time = new GregorianCalendar().getTimeInMillis();
    		System.out.println("Time ConcurrentHashMap: "+(finish_time - start_time)+"ms "+ conmap.size()+ "size");
    

    там их 300 штук, и все четные. Я хочу 100-250. Четные, не четные.

×
×
  • Создать...