Как я могу отправить системный ответ, если пользователь что-то говорит? NodeJS/socketio

#javascript #node.js #socket.io

#javascript #node.js #socket.io

Вопрос:

Я хочу сделать так, чтобы пользователь говорил определенную вещь, сокет.io отвечает чем-то.

бывший.
Ввод: !привет
Вывод: привет!

Если есть способ сделать это, я хотел бы знать, как, спасибо!

Я попытался сделать что-то так, чтобы, если пользователь просто нажимает кнопку отправки, он отправлял «Пожалуйста, введите что-нибудь», это может увидеть только пользователь, набравший пробел.

 var spaced = ' ';

if (spaced) {
  socket.emit('message', {
        username: 'System',
        text: 'Please Type Something',
        timestamp: moment().valueOf()
    });
}
  

server.js:

 var PORT = process.env.PORT || 3000;
var express = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var moment = require('moment');
var connectedUsers = {};

app.use(express.static(__dirname   '/public'));

io.on('connection', function(socket) {
  
  /*var socketId = socket.id;
  var clientIp = socket.request.connection.remoteAddress;

    console.log('A user is connected. - IP: '   clientIp   " | ID: "   socketId);*/
  console.log('A user is connected.')

    socket.on('disconnect', function() {
        var userData = connectedUsers[socket.id];
        if (typeof userData !== 'undefined') {
            socket.leave(connectedUsers[socket.id]);
            io.to(userData.room).emit('message', {
                username: 'System',
                text: userData.username   ' has left!',
                timestamp: moment().valueOf()
            });
            delete connectedUsers[socket.id];
        }
    });

    socket.on('joinRoom', function(req, callback) {
        if (req.room.replace(/s/g, "").length > 0 amp;amp; req.username.replace(/s/g, "").length > 0) {
            var nameTaken = false;

            Object.keys(connectedUsers).forEach(function(socketId) {
                var userInfo = connectedUsers[socketId];
                if (userInfo.username.toUpperCase() === req.username.toUpperCase()) {
                    nameTaken = true;
                }
            });

            if (nameTaken) {
                callback({
                    nameAvailable: false,
                    error: 'This username is taken, please choose another one.'
                });
            } else {
                connectedUsers[socket.id] = req;
                socket.join(req.room);
                socket.broadcast.to(req.room).emit('message', {
                    username: 'System',
                    text: req.username   ' has joined!',
                    timestamp: moment().valueOf()
                });
                callback({
                    nameAvailable: true
                });
            }
        } else {
            callback({
                nameAvailable: false,
                error: 'Please complete the forum.'
            });
        }
    });

    socket.on('message', function(message) {
        message.timestamp = moment().valueOf();
        io.to(connectedUsers[socket.id].room).emit('message', message);
    });

    socket.emit('message', {
        username: 'System',
        text: 'Ask someone to join this chat room to start talking.',
        timestamp: moment().valueOf()
    });

});

http.listen(PORT, function() {
    console.log('Server started on port '   PORT);
});
  

Тело в моем index.html:

 <body>
    <div class="container">
      <div id="login-area">
        <div class="row">
          <div class="large-7 medium-7 small-12 columns small-centered">
            <form id="login-form">
              <h2>Twintails🎀 Bot Chatroom</h2>
              <p id="error-msg"></p>
              <input
                type="text"
                name="username"
                placeholder="Enter your username"
              />
              <input
                type="text"
                name="room"
                placeholder="Enter a chat room name"
              />
              <input type="submit" value="Join Chat" />
            </form>
          </div>
        </div>
      </div>
      <div class="row" id="message-area">
        <div class="large-8 columns small-centered">
          <h2>Twintails🎀 Bot Chatroom</h2>
          <div class="chat-wrap">
            <div class="top">
              <h5 class="room-title"></h5>
            </div>
            <div id="messages"></div>
            <form id="message-form">
              <div class="input-group">
                <input
                  type="text"
                  placeholder="Type message here"
                  class="input-group-field"
                  name="message"
                />
                <div class="input-group-button">
                  <input type="submit" value="Send" />
                </div>
              </div>
            </form>
          </div>
        </div>
      </div>
      <footer>
        <p>
          Add the
          <a href="https://twintails-bot-dashboard.glitch.me/" target="_blank"
            >Twintails🎀 bot!</a
          >
        </p>
        <p>
          Use the 'Mod' room to talk to mods!
        </p>
      </footer>
    </div>
    <script src="/js/jquery.js"></script>
    <script src="/js/socket.io-1.7.3.min.js"></script>
    <script src="/js/moment.min.js"></script>
    <script src="/js/app.js"></script>
    <script src="/js/foundation.min.js"></script>
    <script type="text/javascript">
      $(document).foundation();
    </script>
  </body>
  

Комментарии:

1. Пожалуйста, покажите более полный пример кода как на клиенте, так и на сервере и добавьте к вашему объяснению, поскольку пока не ясно, чего вы пытаетесь достичь. Легко просмотреть входящее сообщение и решить, что отправить обратно (если что-нибудь есть). Кроме того, когда вы говорите «пользователь что-то говорит», что именно это означает? Это входящий сокет? сообщение ввода-вывода или вы говорите о том, чтобы что-то сказать в динамик на клиенте?

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

Ответ №1:

Если вы говорите о том, что когда сервер получает определенное введенное сообщение, вы хотите отправить конкретный ответ непосредственно пользователю, который ввел это сообщение, вы можете просто сделать что-то вроде этого:

 // this is your existing server-side handler which the `if` statement added to it
socket.on('message', function(message) {
    if (message.text === '!hi') {
        socket.emit('message', {
            username: 'System',
            text: 'hello!',
            timestamp: moment().valueOf()
        });
    } else {
        message.timestamp = moment().valueOf();
        io.to(connectedUsers[socket.id].room).emit('message', message);
    }
});
  

Ответ №2:

Почему бы просто не использовать простой оператор if?

 if (mySocketData === "!hi") {
    socket.emit('Hello!');
}
  

Новое для сокета.ИО, не уверен, поможет ли это, извини!

Комментарии:

1. Это довольно глупый ответ, я никогда не использовал Socket. Ввод-вывод, так что это явно заполнитель.