powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Реализация REST/API (JSON) в Spring Boot
22 сообщений из 22, страница 1 из 1
Реализация REST/API (JSON) в Spring Boot
    #39897378
fallen2019
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я создал чат где могут общаться несколько людей, так вот он у меня работает. Но нужно переделать так чтобы он работал через Rest/API JSON можете помочь переделать?

Application class

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }


    @Bean
    UnicastProcessor<ChatMessage> publisher(){
        return  UnicastProcessor.create();
    }

    @Bean
    Flux<ChatMessage> messages(UnicastProcessor<ChatMessage> publisher) {
        return publisher.replay(30).autoConnect();
    }
}


ChatMessage class

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
class ChatMessage {
  private String from;
  private String message;

  ChatMessage(String from, String message) {
    this.from = from;
    this.message = message;
  }

  String getFrom() {
    return from;
  }

  String getMessage() {
    return message;
  }
}


MainView class

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
@StyleSheet("frontend://styles/styles.css")
@Route
@PWA(name = "Vaadin Chat", shortName = "Vaadin Chat")
@Push
public class MainView extends VerticalLayout {

  private final UnicastProcessor<ChatMessage> publisher;
  private final Flux<ChatMessage> messages;
  private String username;


  public MainView(UnicastProcessor<ChatMessage> publisher,
                  Flux<ChatMessage> messages) {
    this.publisher = publisher;
    this.messages = messages;
    addClassName("main-view");
    setSizeFull();
    setDefaultHorizontalComponentAlignment(Alignment.CENTER);

    H1 header = new H1("Vaadin Chat");
    header.getElement().getThemeList().add("dark");

    add(header); 

    askUsername();
  }


  private void askUsername() {
    HorizontalLayout layout = new HorizontalLayout();
    TextField usernameField = new TextField();
    Button startButton = new Button("Start chat");

    layout.add(usernameField, startButton);

    startButton.addClickListener(click -> {
      username = usernameField.getValue();
      remove(layout);
      showChat();
    });

    add(layout);
  }

  private void showChat() {
    MessageList messageList = new MessageList();

    add(messageList, createInputLayout());
    expand(messageList);


    messages.subscribe(message -> {
      getUI().ifPresent(ui ->
          ui.access(() ->
              messageList.add(
                  new Paragraph(message.getFrom() + ": " +
                      message.getMessage())
              )
          ));

    });
  }

  private Component createInputLayout() {
    HorizontalLayout layout = new HorizontalLayout();
    layout.setWidth("100%");

    TextField messageField = new TextField();
    Button sendButton = new Button("Send");
    sendButton.addThemeVariants(ButtonVariant.LUMO_PRIMARY);

    layout.add(messageField, sendButton);
    layout.expand(messageField);

    sendButton.addClickListener(click -> {
      publisher.onNext(new ChatMessage(username, messageField.getValue()));
      messageField.clear();
      messageField.focus();
    });
    messageField.focus();

    return layout;
  }

}


MessageList class

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class MessageList extends Div {

  public MessageList() {
    addClassName("message-list");
  }

  @Override
  public void add(Component... components) {
    super.add(components);

    components[components.length-1]
        .getElement()
        .callFunction("scrollIntoView");
  }
}
...
Рейтинг: 0 / 0
Реализация REST/API (JSON) в Spring Boot
    #39897379
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fallen2019,
Тут подскажут если ты сам начал что то делать. Иначе в ветку работа.
...
Рейтинг: 0 / 0
Реализация REST/API (JSON) в Spring Boot
    #39897380
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Реализация REST/API (JSON) в Spring Boot
    #39897381
fallen2019
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crutchmaster,

У меня все работает, только с Рестом не дружу. Можете помочь его реализовать только с Rest/API(JSON)
...
Рейтинг: 0 / 0
Реализация REST/API (JSON) в Spring Boot
    #39897382
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fallen2019,

Вон, дал гайд, берешь и делаешь так же. Что там не понятного, если там даже мне всё понятно? Делаешь класс с @RestController - это твой контроллер. Ставишь @RequestMapping на какой-нибудь метод - это твоё api, которое жрёт веб запросы. Надо больше фишек - гуглишь доку по спрингу, я больше ничего не знаю. Спрашивай свои ответы.
...
Рейтинг: 0 / 0
Реализация REST/API (JSON) в Spring Boot
    #39897383
fallen2019
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crutchmaster,

Я вот начал у вас есть телеграм, что там советы спрашивать, просто не хочу засорять форум
...
Рейтинг: 0 / 0
Реализация REST/API (JSON) в Spring Boot
    #39897384
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fallen2019,

Нету. А форум для того и нужен, чтобы спрашивать всякие разные вопросы, которые потом кто-нибудь нагуглит.
...
Рейтинг: 0 / 0
Реализация REST/API (JSON) в Spring Boot
    #39897917
fallen2019
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crutchmaster,
Реализовал
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
@Service
public class RestService {
    private final RestTemplate restTemplate;
    private final MessageService messageService;

    public RestService(RestTemplateBuilder restTemplateBuilder,
                       MessageService messageService) {
        this.restTemplate = restTemplateBuilder.build();
        this.messageService = messageService;
    }

    public void saveMessage(Message message)
    {
        String url = "http://localhost:8080/api/save";

        this.restTemplate.put(url, new Gson().toJson(message));
        this.messageService.add(new Message(message.getFrom(), message.getMessage()));
    }

    public List<Message> getLast() {
        String url = "http://localhost:8080/api/last";

        String json = restTemplate.getForObject(url, String.class);
        return new Gson().fromJson(json, new TypeToken<List<Message>>(){}.getType());
    }
}
...
Рейтинг: 0 / 0
Реализация REST/API (JSON) в Spring Boot
    #39897921
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fallen2019,

Молодец. Теперь влепи перед классом @RestController, перед кажым методом @RequestMapping, выкидывай нахрен все эти твои "private final RestTemplate restTemplate;", MessageService сделай @Component класс и @Autowired перед полем, где ты его объявляешь в RestService. То, что возвращает твоё API кастить ни во что не надо.
Вот эту доку прочитал? https://spring.io/guides/gs/rest-service/ ???
Какой там url для запроса? Какой параметр надо передавать в этот url? Что он ставит по дефотлу?
...
Рейтинг: 0 / 0
Реализация REST/API (JSON) в Spring Boot
    #39897930
fallen2019
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crutchmaster,

Спасибо вам за помощь) вроде бы все сделал, пока работает.

У меня только одна вещь осталась у меня сообщения отправляются только тогда, когда нажимаю левой кнопкой мыши на кнопку "отправить." Так вот как можно сделать так, чтобы еще кнопкой "Ентер" мог отправить сообщение.

Я вот нашел кусок кода
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
TextField myTextField = new TextField("A text field");
myTextField.setImmediate(true);
OnEnterKeyHandler onEnterHandler=new OnEnterKeyHandler(){
    @Override
    public void onEnterKeyPressed() {
        publisher.onNext(new Message(username, messageField.getValue()));
        messageField.clear();
        messageField.focus();
    }
};
onEnterHandler.installOn(myTextField);




Как можно его в моем MainView вставить так, чтобы левой кнопкой мыши и кнопкой ентер на клавиатуре мог отправить сообщение

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
package org.vaadin.marcus.spring;

import com.vaadin.flow.component.Component;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.button.ButtonVariant;
import com.vaadin.flow.component.dependency.StyleSheet;
import com.vaadin.flow.component.html.H1;
import com.vaadin.flow.component.html.Paragraph;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.page.Push;
import com.vaadin.flow.component.textfield.TextField;
import org.springframework.beans.factory.annotation.Autowired;

import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.router.Route;
import com.vaadin.flow.server.PWA;
import org.vaadin.marcus.spring.model.Message;
import org.vaadin.marcus.spring.service.RestService;
import reactor.core.publisher.Flux;
import reactor.core.publisher.UnicastProcessor;

import java.util.List;

@StyleSheet("frontend://styles/styles.css")
@Route
@PWA(name = "Vaadin Chat", shortName = "Vaadin Chat")
@Push
public class MainView extends VerticalLayout {
  private final UnicastProcessor<Message> publisher;
  private final Flux<Message> messages;
  private String username;

  @Autowired
  private RestService restService;

  public MainView(UnicastProcessor<Message> publisher,
                  Flux<Message> messages) {
    this.publisher = publisher;
    this.messages = messages;

    addClassName("main-view");
    setSizeFull();
    setDefaultHorizontalComponentAlignment(Alignment.CENTER);

    H1 header = new H1("Vaadin Chat");
    header.getElement().getThemeList().add("dark");

    add(header); 

    askUsername();
  }

  
  private void askUsername() {
    HorizontalLayout layout = new HorizontalLayout();
    TextField usernameField = new TextField();
    Button startButton = new Button("Start chat");

    layout.add(usernameField, startButton);

    startButton.addClickListener(click -> {
      username = usernameField.getValue();
      remove(layout);
      showChat();
    });

    add(layout);
  }

  private void showChat() {
    MessageList messageList = new MessageList();

    add(messageList, createInputLayout());
    expand(messageList);

    List<Message> lasts = restService.getLast();
    for (Message message : lasts)
      messageList.add(new Paragraph(message.getFrom() + ": " + message.getMessage()));


    messages.subscribe(message -> {
      getUI().ifPresent(ui ->
          ui.access(() ->
              messageList.add(
                  new Paragraph(message.getFrom() + ": " +
                      message.getMessage())
              )
          ));

      restService.saveMessage(message);
    });
  }

  private Component createInputLayout() {
    HorizontalLayout layout = new HorizontalLayout();
    layout.setWidth("100%");

    TextField messageField = new TextField();
    Button sendButton = new Button("Send");
    sendButton.addThemeVariants(ButtonVariant.LUMO_PRIMARY);

    layout.add(messageField, sendButton);
    layout.expand(messageField);

    sendButton.addClickListener(click -> {
      publisher.onNext(new Message(username, messageField.getValue()));
      messageField.clear();
      messageField.focus();
    });
    messageField.focus();

    return layout;
  }

}
...
Рейтинг: 0 / 0
Реализация REST/API (JSON) в Spring Boot
    #39897941
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fallen2019

У меня только одна вещь осталась у меня сообщения отправляются только тогда, когда нажимаю левой кнопкой мыши на кнопку "отправить." Так вот как можно сделать так, чтобы еще кнопкой "Ентер" мог отправить сообщение.

Это уже не относится к теме запросов.
п.с. для сервиса лучше сделать интерфейс назвать его RestService, а этот сделать его реализацией и соответственно назвать RestServiceImpl, как обычно принято называть (и имплементить в нём интерфейс) и автоварить интерфейс, а не реализацию.
...
Рейтинг: 0 / 0
Реализация REST/API (JSON) в Spring Boot
    #39897942
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы работало по кнопке Enter ну жно листенер повесить на поле где вводится текст, проверять что он в фокусе и только тогда выполнять отправку. Конкретный код не подскажу, давно в ваадин не залазил, но суть примерно такая
...
Рейтинг: 0 / 0
Реализация REST/API (JSON) в Spring Boot
    #39897945
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixic,

Зачем так делают, кстати? У меня такой проект, эти .*impl просто мешаются.
...
Рейтинг: 0 / 0
Реализация REST/API (JSON) в Spring Boot
    #39897988
fallen2019
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crutchmaster,

Я вроде добавил чтобы кнопкой Ентер можно было отправить сообщение,
но он у меня ругается
Код: java
1.
2.
3.
cannot find symbol
  symbol:   method addClickShortcut(Key)
  location: variable sendButton of type Button




Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
import java.util.List;

@StyleSheet("frontend://styles/styles.css")
@Route
@PWA(name = "Vaadin Chat", shortName = "Vaadin Chat")
@Push
public class MainView extends VerticalLayout {
  private final UnicastProcessor<Message> publisher;
  private final Flux<Message> messages;
  private String username;

  @Autowired
  private RestService restService;

  public MainView(UnicastProcessor<Message> publisher,
                  Flux<Message> messages) {
    this.publisher = publisher;
    this.messages = messages;

    addClassName("main-view");
    setSizeFull();
    setDefaultHorizontalComponentAlignment(Alignment.CENTER);

    H1 header = new H1("Vaadin Chat");
    header.getElement().getThemeList().add("dark");

    add(header); 

    askUsername();
  }

  
  private void askUsername() {
    HorizontalLayout layout = new HorizontalLayout();
    TextField usernameField = new TextField();
    Button startButton = new Button("Start chat");

    layout.add(usernameField, startButton);

    startButton.addClickListener(click -> {
      username = usernameField.getValue();
      remove(layout);
      showChat();
    });

    add(layout);
  }

  private void showChat() {
    MessageList messageList = new MessageList();

    add(messageList, createInputLayout());
    expand(messageList);

    List<Message> lasts = restService.getLast();
    for (Message message : lasts)
      messageList.add(new Paragraph(message.getFrom() + ": " + message.getMessage()));


    messages.subscribe(message -> {
      getUI().ifPresent(ui ->
          ui.access(() ->
              messageList.add(
                  new Paragraph(message.getFrom() + ": " +
                      message.getMessage())
              )
          ));

      restService.saveMessage(message);
    });
  }

  private Component createInputLayout() {
    HorizontalLayout layout = new HorizontalLayout();
    layout.setWidth("100%");

    TextField messageField = new TextField();
    Button sendButton = new Button("Send");
    sendButton.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
    sendButton.addClickShortcut(Key.ENTER).listenOn(messageField);

    layout.add(messageField, sendButton);
    layout.expand(messageField);

    sendButton.addClickListener(click -> {
      publisher.onNext(new Message(username, messageField.getValue()));
      messageField.clear();
      messageField.focus();
    });
    messageField.focus();

    return layout;
  }

}
...
Рейтинг: 0 / 0
Реализация REST/API (JSON) в Spring Boot
    #39897994
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fallen2019,

Вообще без идей, что это у тебя за serverside хрень с кнопками. Зделай лучще, как модные пацаны api+single page application на реакте.
...
Рейтинг: 0 / 0
Реализация REST/API (JSON) в Spring Boot
    #39898255
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
Nixic,
Зачем так делают, кстати? У меня такой проект, эти .*impl просто мешаются.

https://www.google.com/search?q=зачем нужны интерфейсы и реализации
...
Рейтинг: 0 / 0
Реализация REST/API (JSON) в Spring Boot
    #39898363
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixic,

Уточняю вопрос, нахрена их делать, если реализация может быть только одна и никто это не будет что-то там приделывать с боку в принципе?
...
Рейтинг: 0 / 0
Реализация REST/API (JSON) в Spring Boot
    #39898370
fallen2019
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crutchmaster,
получилось добавить кнопку
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
@StyleSheet("frontend://styles/styles.css")
@Route
@PWA(name = "Vaadin Chat", shortName = "Vaadin Chat")
@Push
public class MainView extends VerticalLayout {
  private final UnicastProcessor<Message> publisher;
  private final Flux<Message> messages;
  private String username;

  @Autowired
  private RestService restService;

  public MainView(UnicastProcessor<Message> publisher,
                  Flux<Message> messages) {
    this.publisher = publisher;
    this.messages = messages;

    addClassName("main-view");
    setSizeFull();
    setDefaultHorizontalComponentAlignment(Alignment.CENTER);

    H1 header = new H1("Vaadin Chat");
    header.getElement().getThemeList().add("dark");

    add(header); 

    askUsername();
  }

  
  private void askUsername() {
    HorizontalLayout layout = new HorizontalLayout();
    TextField usernameField = new TextField();
    Button startButton = new Button("Start chat");

    layout.add(usernameField, startButton);

    startButton.addClickListener(click -> {
      username = usernameField.getValue();
      remove(layout);
      showChat();
    });

    add(layout);
  }

  private void showChat() {
    MessageList messageList = new MessageList();

    add(messageList, createInputLayout());
    expand(messageList);

    List<Message> lasts = restService.getLast();
    for (Message message : lasts)
      messageList.add(new Paragraph(message.getFrom() + ": " + message.getMessage()));

    messages.subscribe(message -> {
      getUI().ifPresent(ui ->
          ui.access(() ->
              messageList.add(
                  new Paragraph(message.getFrom() + ": " +
                      message.getMessage())
              )
          ));
    });
  }

  private Component createInputLayout() {
    HorizontalLayout layout = new HorizontalLayout();
    layout.setWidth("100%");

    TextField messageField = new TextField();
    messageField.addKeyDownListener(Key.ENTER, keyDownEvent -> sender(messageField));
    Button sendButton = new Button("Send");
    sendButton.addThemeVariants(ButtonVariant.LUMO_PRIMARY);

    layout.add(messageField, sendButton);
    layout.expand(messageField);

    sendButton.addClickListener(click -> sender(messageField));
    messageField.focus();

    return layout;
  }
 private void sender(TextField textField) {
    Message message = new Message(username, textField.getValue());
    publisher.onNext(message);
    restService.saveMessage(message);
    textField.clear();
    textField.focus();
  }
}
...
Рейтинг: 0 / 0
Реализация REST/API (JSON) в Spring Boot
    #39898392
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
Nixic,
У меня такой проект, эти .*impl просто мешаются.

Дело привычки, мне проще по интерфейсам пробежаться хотя, да и некрасиво имплиментации автоварить как-то, хрен поймешь потом по названию, то ли это интерфейс, то ли сервис.
Если написано, что EmployeeService, то сразу понятно, что интерфейс и по одному клику можно или в реализацию метода провалиться или в интерфейс где все методы как на ладони.
Про плюсы интерфейсов уже даже и не говорю, видимо у тебя нет понимания пока что и опыта копания в чужом коде в больших проектах или в своём же через 2-3 месяца. А тем более ты туда еще и ваадин закинул, добавил функционала UI в проект с бэком.
Для одной кнопки и для личного проекта, конечно, можно и маппинг в контроллеры напихать и репозитории, если есть понимание, что проект не будет развиваться дальше, но в итоге это станет хреновой привычкой.
...
Рейтинг: 0 / 0
Реализация REST/API (JSON) в Spring Boot
    #39898395
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fallen2019
crutchmaster,
получилось добавить кнопку

При открытии формы каждый раз будет никнейм спрашивать?
...
Рейтинг: 0 / 0
Реализация REST/API (JSON) в Spring Boot
    #39898397
fallen2019
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nixic,

да
...
Рейтинг: 0 / 0
Реализация REST/API (JSON) в Spring Boot
    #39898449
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fallen2019
Nixic,
да

Надо юзвера куда-то сохранять, в контекст и оттуда брать проверяя есть ли там кто уже.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Реализация REST/API (JSON) в Spring Boot
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]