1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.

Интерактивная свадьба

Тема в разделе "Дополнения для Jimbot", создана пользователем cerber, 20 фев 2015.

  1. TopicStarter Overlay
    cerber

    cerber Местный инквизитор Команда форума

    Регистрация:
    25.02.11
    Сообщения:
    8.736
    Симпатии:
    2.783
    Баллы:
    575
    Пол:
    Мужской
    Адрес:
    АДА
    сам класс
    Код:
    package ru.jimbot.modules.chat;
    
    import java.io.FileOutputStream;
    import java.io.OutputStreamWriter;
    import java.util.HashMap;
    import java.util.Vector;
    import ru.jimbot.modules.Cmd;
    import ru.jimbot.modules.CommandExtend;
    import ru.jimbot.modules.CommandParser;
    import ru.jimbot.protocol.IcqProtocol;
    
    /**
    * АфТоР BezzzDelnick
    **/
    
    public class WeddingCommand {
        private CommandParser parser;
        private HashMap<String, Cmd> commands = new HashMap<String, Cmd>();
        private ChatServer srv;
        public ChatProps psp;
        private HashMap<String, CommandExtend> wedding;
    
        public WeddingCommand(ChatServer s){
            parser = new CommandParser(commands);
            srv = s;
            wedding= new HashMap<String, CommandExtend>();
            psp = ChatProps.getInstance(srv.getName());
            init();
        }
    
        private void init() {
          commands.put("!предложить", new Cmd("!предложить", "$n", 1));
          commands.put("!развод",new Cmd("!развод", "$n",2));
          commands.put("!свадьбы", new Cmd("!свадьбы", "$n", 3));
          commands.put("!разводы",new Cmd("!разводы", "$n",4));
        }
    
        public boolean commandWedding(IcqProtocol proc, String uin, String mmsg) {
            String tmsg = mmsg.trim();
            int tp = 0;
            if(wedding.containsKey(uin)){
                if(!wedding.get(uin).isExpire()){
                    tp = parser.parseCommand(wedding.get(uin).getCmd());
                }else {
                    tp = parser.parseCommand(tmsg);
                    wedding.remove(uin);
                }
            }else
            tp = parser.parseCommand(tmsg);
            int tst=0;
            if(tp<0)
            tst=0;
            else
            tst = tp;
            boolean f = true;
            switch (tst){
          case 1:
            WeddingOffer(proc, uin, parser.parseArgs(tmsg), mmsg);
            break;
          case 2:
            WeddingDivorce(proc, uin, parser.parseArgs(tmsg), mmsg);
            break;
          case 3:
            WeddingOfferHist(proc, uin);
            break;
          case 4:
            WeddingDivorceHist(proc, uin);
            break;
                default:
                f = false;
            }
            return f;
        }
    
    /**
    * Предложить выйти замуж.
    */
    public void WeddingOffer(IcqProtocol proc, String uin, Vector v, String mmsg){
    try {
    class WedInfo {
    boolean started = false;
    int[] id = new int[2]; //пользователи
    int currentAttacker = 0;
    int[] place = new int[2];
    WedInfo(int id0, int id1) {
    id[0] = id0;
    id[1] = id1;
    place[0] = -1;
    place[1] = -1;
    }
    }
    if (v.size()>0) {
    if ((!isChat(proc, uin)) && (!psp.testAdmin(uin))) return;
    if (!auth(proc, uin, "Wedding")) return;
    Users target = srv.us.getUser((Integer)v.get(0)); // невеста
    Users sender = srv.us.getUser(uin); // муж
    int room = psp.getIntProperty("wedding.room");
    if(sender.room!=room)
    {
    proc.mq.add(uin,"Система: Загс в (" + room + ") комнате - " + srv.us.getRoom(room).getName());
    return;
    }
    if(target.room!=sender.room) {
    proc.mq.add(uin,"Система: Ты должен находиться в одной комнате, кому предлогаешь жениться.");
    return;
    }
    
    if (target.state==UserWork.STATE_NO_REG) {
    proc.mq.add(uin,"Священник: Пользователя не найден.");
    return;
    }
    
    if (target.state!=UserWork.STATE_CHAT) {
    proc.mq.add(uin,"Священник: Пользователь не в чате.");
    return;
    }
    
    if (sender.id==target.id) {
    proc.mq.add(uin,"Священник: Нельзя делать предложение себе");
    return;
    }
    /*Тест на пол*/
    if(psp.getBooleanProperty("wedding.floor.on.off")){
    /*Невеста*/
    if(target.lname.equalsIgnoreCase("")){
    proc.mq.add(uin,"Система: Твоя невеста \"" + target.localnick + "\" должна указать свой пол, набрав команду !анкета");
    return;
    } else if (!target.lname.equalsIgnoreCase("ж")){
    proc.mq.add(uin,"Система: Невеста не женского пола. Однополые браки в чате запрещены!!!");
    return;
    }
    }
    if (!target.rsid.equals("") || !sender.rsid.equals("")) {
    proc.mq.add(uin, "Система: Пользователи или один из пользователей в браке.");
    return;
    }
    CommandExtend ucmd = wedding.get(target.sn);
    if (ucmd!=null && !ucmd.isExpire()) {
    proc.mq.add(uin,"Священник: Пользователь сейчас выполняет интерактивную команду, попробуйте позже.");
    return;
    }
    Vector v2=new Vector(2);
    v2.add(0);
    v2.add(new WedInfo(sender.id, target.id));
    ucmd = new CommandExtend(target.sn,mmsg,null,v2,300000);
    wedding.put(target.sn, ucmd);
    srv.getIcqProcess(target.basesn).mq.add(target.sn, "Священник: Пользователь "+sender.localnick+" ["+sender.id+"] сделал вам предложение руки и сердца *IN LOVE*\n"
            + "Напишите \"да\", чтобы выйти за него замуж\n"
            + "Если вы хотите отказаться, напишите \"нет\"");
    proc.mq.add(uin, "Священник: Предложение руки и сердца отправлено пользователю "+target.localnick+" ["+target.id+"]");
    return;
    }
    CommandExtend ucmd = wedding.get(uin);
    if (ucmd==null) {
    proc.mq.add(uin, "Ошибочка: Произошла неизвестная ошибка.");
    return;
    }
    Vector v2=ucmd.getData();
    WedInfo info = (WedInfo)v2.get(1);
    if (!info.started) { //Ответ на предложение
    String answer = mmsg.toLowerCase();
    if (answer.equals("нет") || answer.equals("no")) {
    wedding.remove(uin);
    proc.mq.add(uin, "Священник: Вы отказались от свадьбы.");
    Users sender=srv.us.getUser(info.id[0]);     //Тот, кто предложил
    Users target=srv.us.getUser(uin);          //Тот, кому предложили
    if (sender.state==UserWork.STATE_CHAT) {
    srv.getIcqProcess(sender.basesn).mq.add(sender.sn, "Священник: Пользователь "+target.localnick+" ["+target.id+"] отказался от свадьбы *PARDON* ");
    }
    return;
    }
    if (answer.equals("да") || answer.equals("yes")) {
    Users sender=srv.us.getUser(info.id[0]); //Тот, кто предложил
    if (sender.state!=UserWork.STATE_CHAT) {
    wedding.remove(uin);
    proc.mq.add(uin, "Священник: Пока вы думали, пользователь "+sender.localnick+" ["+sender.id+"] вышел из чата.");
    return;
    }
    if (wedding.containsKey(sender.sn)) {
    wedding.remove(uin);
    proc.mq.add(uin, "Священник: Пользователь "+sender.localnick+" ["+sender.id+"] сейчас выполняет интерактивную команду. Вы не можете принять предложение.");
    Users target=srv.us.getUser(uin); //Тот, кому предложили
    srv.getIcqProcess(sender.basesn).mq.add(sender.sn, "Священник: Пользователь "+target.localnick+" ["+target.id+"] не смог принять ваше предложение, поскольку вы выполняете интерактивную команду.");
    return;
    }
    Users target=srv.us.getUser(uin);  //Тот, кому предложили
    target.rs=sender.id;
    sender.rs=target.id;
    target.rsid="_жена_";
    sender.rsid="_муж_";
    srv.us.updateUser(target);
    srv.us.updateUser(sender);
    srv.us.db.event(sender.id, uin, "SVADBA", target.id, "", "поженились");
    srv.cq.addMsg("Священник: У пользователей *IN LOVE*" + sender.localnick + "*IN LOVE* и *IN LOVE*" + target.localnick + "*IN LOVE* " + " состоялась свадьба, бухаем *DRINK*!", target.sn, target.room);
    srv.getIcqProcess(sender.basesn).mq.add(sender.sn, "Священник: Поздравляю у тебя свадьба, твоя невеста " + target.localnick + " [" + target.id + "] *IN LOVE*");
    srv.getIcqProcess(target.basesn).mq.add(target.sn, "Священник: Поздравляю у тебя свадьба, твой жених " + sender.localnick + " [" + sender.id + "] *IN LOVE*");
    wedding.put(uin, new CommandExtend(uin,ucmd.getCmd(),null,v2,10));
    return;
    }
    proc.mq.add(uin, "Священник: Нужно ответить \"да\" или \"нет\". Попробуйте ещё раз.");
    wedding.put(uin, new CommandExtend(uin,ucmd.getCmd(),null,v2,300000));
    return;
    }
    } catch (Exception ex) {
    ex.printStackTrace();
    proc.mq.add(uin, "Ошибка " + ex.getMessage());
    }
    }
    
    /**
    * Предложить развод.
    */
    public void WeddingDivorce(IcqProtocol proc, String uin, Vector v, String mmsg){
    try {
    class WedInfo {
    boolean started = false;
    int[] id = new int[2]; //пользователи
    int currentAttacker = 0;
    int[] place = new int[2];
    WedInfo(int id0, int id1) {
    id[0] = id0;
    id[1] = id1;
    place[0] = -1;
    place[1] = -1;
    }
    }
    if (v.size()>0) {
    if ((!isChat(proc, uin)) && (!psp.testAdmin(uin))) return;
    if (!auth(proc, uin, "Wedding")) return;
    Users target = srv.us.getUser((Integer)v.get(0)); // невеста
    Users sender = srv.us.getUser(uin); // муж
    int room = psp.getIntProperty("wedding.room");
    if(sender.room!=room)
    {
    proc.mq.add(uin,"Система: Загс в (" + room + ") комнате - " + srv.us.getRoom(room).getName());
    return;
    }
    if(target.room!=sender.room) {
    proc.mq.add(uin,"Система: Ты должен находиться в одной комнате, кому предлогаешь развод.");
    return;
    }
    
    if (target.state==UserWork.STATE_NO_REG) {
    proc.mq.add(uin,"Священник: Пользователя не найден.");
    return;
    }
    
    if (target.state!=UserWork.STATE_CHAT) {
    proc.mq.add(uin,"Священник: Пользователь не в чате.");
    return;
    }
    
    if (sender.id==target.id) {
    proc.mq.add(uin,"Священник: Нельзя делать развод с самим собой.");
    return;
    }
    if (target.rsid.equals("") || sender.rsid.equals("")) {
    proc.mq.add(uin, "Система: Пользователи или один из пользователей в разводе.");
    return;
    }
    CommandExtend ucmd = wedding.get(target.sn);
    if (ucmd!=null && !ucmd.isExpire()) {
    proc.mq.add(uin,"Священник: Пользователь сейчас выполняет интерактивную команду, попробуйте позже.");
    return;
    }
    Vector v2=new Vector(2);
    v2.add(0);
    v2.add(new WedInfo(sender.id, target.id));
    ucmd = new CommandExtend(target.sn,mmsg,null,v2,300000);
    wedding.put(target.sn, ucmd);
    srv.getIcqProcess(target.basesn).mq.add(target.sn, "Священник: Пользователь "+sender.localnick+" ["+sender.id+"] хочет развестись с вами,\n"
            + "Напишите \"да\", чтобы развестись с ним,\n"
            + "Если вы хотите отказаться, напишите \"нет\".");
    proc.mq.add(uin, "Священник: Предложение на развод отправлено пользователю "+target.localnick+" ["+target.id+"]");
    return;
    }
    CommandExtend ucmd = wedding.get(uin);
    if (ucmd==null) {
    proc.mq.add(uin, "Ошибочка: Произошла неизвестная ошибка.");
    return;
    }
    Vector v2=ucmd.getData();
    WedInfo info = (WedInfo)v2.get(1);
    if (!info.started) { //Ответ на предложение
    String answer = mmsg.toLowerCase();
    if (answer.equals("нет") || answer.equals("no")) {
    wedding.remove(uin);
    proc.mq.add(uin, "Священник: Вы отказались от развода.");
    Users sender=srv.us.getUser(info.id[0]);     //Тот, кто предложил
    Users target=srv.us.getUser(uin);          //Тот, кому предложили
    if (sender.state==UserWork.STATE_CHAT) {
    srv.getIcqProcess(sender.basesn).mq.add(sender.sn, "Священник: Пользователь "+target.localnick+" ["+target.id+"] отказался от развода *PARDON* ");
    }
    return;
    }
    if (answer.equals("да") || answer.equals("yes")) {
    Users sender=srv.us.getUser(info.id[0]); //Тот, кто предложил
    if (sender.state!=UserWork.STATE_CHAT) {
    wedding.remove(uin);
    proc.mq.add(uin, "Священник: Пока вы думали, пользователь "+sender.localnick+" ["+sender.id+"] вышел из чата.");
    return;
    }
    if (wedding.containsKey(sender.sn)) {
    wedding.remove(uin);
    proc.mq.add(uin, "Священник: Пользователь "+sender.localnick+" ["+sender.id+"] сейчас выполняет интерактивную команду. Вы не можете принять развод.");
    Users target=srv.us.getUser(uin); //Тот, кому предложили
    srv.getIcqProcess(sender.basesn).mq.add(sender.sn, "Священник: Пользователь "+target.localnick+" ["+target.id+"] не смог принять ваш развод, поскольку вы выполняете интерактивную команду.");
    return;
    }
    Users target=srv.us.getUser(uin);  //Тот, кому предложили
    target.rs=0;
    sender.rs=0;
    target.rsid="";
    sender.rsid="";
    srv.us.updateUser(target);
    srv.us.updateUser(sender);
    srv.us.db.event(sender.id, uin, "RAZVOD", target.id, "", "развелись");
    srv.cq.addMsg("Священник: У пользователи " + sender.localnick + " и " + target.localnick + " развелись, как жаль :-(/>", target.sn, target.room);
    srv.getIcqProcess(sender.basesn).mq.add(sender.sn, "Священник: Как жаль, что " + target.localnick + " [" + target.id + "] больше не твоя невеста.");
    srv.getIcqProcess(target.basesn).mq.add(target.sn, "Священник: Как жаль, Что " + sender.localnick + " [" + sender.id + "] больше не твой жених.");
    wedding.put(uin, new CommandExtend(uin,ucmd.getCmd(),null,v2,10));
    return;
    }
    proc.mq.add(uin, "Священник: Нужно ответить \"да\" или \"нет\". Попробуйте ещё раз.");
    wedding.put(uin, new CommandExtend(uin,ucmd.getCmd(),null,v2,300000));
    return;
    }
    } catch (Exception ex) {
    ex.printStackTrace();
    proc.mq.add(uin, "Ошибка " + ex.getMessage());
    }
    }
    
    /**
    * История свадеб.
    */
      public void WeddingOfferHist(IcqProtocol proc, String uin) {
        if ((!isChat(proc, uin)) && (!psp.testAdmin(uin))) return;
        if (!auth(proc, uin, "Wedding")) return;
        try {
          proc.mq.add(uin, srv.us.getWeddingHistory());
        } catch (Exception ex) {
          ex.printStackTrace();
          proc.mq.add(uin, ex.getMessage());
        }
      }
    
    /**
    * История разводов.
    */
      public void WeddingDivorceHist(IcqProtocol proc, String uin) {
        if ((!isChat(proc, uin)) && (!psp.testAdmin(uin))) return;
        if (!auth(proc, uin, "Wedding")) return;
        try {
          proc.mq.add(uin, srv.us.getDivorceHistory());
        } catch (Exception ex) {
          ex.printStackTrace();
          proc.mq.add(uin, ex.getMessage());
        }
      }
    
      //////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////
    
    /**
    * Проверка на нахождения пользователь в чате или нет.
    */
    public boolean isChat(IcqProtocol proc,String uin) {
    try{
    if(srv.us.getUser(uin).state==UserWork.STATE_CHAT){
    return true;
    } else {
    proc.mq.add(uin, "Система: Чтобы использовать команду вы должны зайти в чат.");
    return false;
    }
    } catch (Exception ex){
    return false;
    }
    }
    
    /**
    * Проверки на полномочия
    */
    public boolean auth(IcqProtocol proc, String uin, String obj){
    if(!srv.us.authorityCheck(uin, obj)){
    proc.mq.add(uin,"Система: Вы не имеете доступа к данной команде.");
    return false;
    }
    return true;
    }
    }
    Вызываем из ChatCommandProc:
    Код:
     public WeddingCommand wedding;
    
        wedding = new WeddingCommand(srv);
    
            if (wedding.commandWedding(proc, uin, mmsg)) return;
    Приписываем ник когда пишут в чат
    Код:
    srv.us.getUser(uin).rsid //приписка жена или муж
    srv.us.getUser(srv.us.getUser(uin).rs).localnick // вызываем ник мужа или жена(вызов по иду)
    В UserWork.java
    Код:
    /**
    * Последние свадьбы.
    */
      public String getWeddingHistory()
      {
        String s = "Система: 10 последних свадеб.\n";
        try {
          PreparedStatement pst = this.db.getDb().prepareStatement("select time, user_id, user_id2, msg from events where type='SVADBA' order by time desc");
          ResultSet rs = pst.executeQuery();
          for (int i = 0; i < 10; ++i) {
            if (rs.next()) {
              s = s + "[" + rs.getTimestamp(1) + "] " + rs.getInt(2) + "(" + ((rs.getInt(2) == 0) ? "Admin" : getUser(rs.getInt(2)).localnick) + ") " + rs.getString(4) + " " + rs.getInt(3) + "(" + ((rs.getInt(3) == 0) ? "Admin" : getUser(rs.getInt(3)).localnick) + ")" + '\n';
            }
          }
          rs.close();
          pst.close();
        } catch (Exception ex) {
          ex.printStackTrace();
        }
        return s;
      }
    
    /**
    * Последние разводы.
    */
      public String getDivorceHistory()
      {
        String s = "Система: 10 последних разводов.\n";
        try {
          PreparedStatement pst = this.db.getDb().prepareStatement("select time, user_id, user_id2, msg from events where type='RAZVOD' order by time desc");
          ResultSet rs = pst.executeQuery();
          for (int i = 0; i < 10; ++i) {
            if (rs.next()) {
              s = s + "[" + rs.getTimestamp(1) + "] " + rs.getInt(2) + "(" + ((rs.getInt(2) == 0) ? "Admin" : getUser(rs.getInt(2)).localnick) + ") " + rs.getString(4) + " " + rs.getInt(3) + "(" + ((rs.getInt(3) == 0) ? "Admin" : getUser(rs.getInt(3)).localnick) + ")" + '\n';
            }
          }
          rs.close();
          pst.close();
        } catch (Exception ex) {
          ex.printStackTrace();
        }
        return s;
      }
    в ChatProps
    Код:
    setBooleanProperty("wedding.floor.on.off", true);
            setIntProperty("wedding.room", 1);
    
    new UserPreference(UserPreference.CATEGORY_TYPE,"wedding", "НАСТРОЙКИ СВАДЬБЫ",""),
    new UserPreference(UserPreference.BOOLEAN_TYPE,"wedding.floor.on.off","Проверку на пол",Boolean.valueOf(getBooleanProperty("wedding.floor.on.off"))),
    new UserPreference(UserPreference.INTEGER_TYPE,"wedding.room","Комната для свадеб",getIntProperty("wedding.room")),
    
    Команда для заполенения анкеты.
    Код:
    authObj.put("Wedding", "Свадьба.");
    commands.put("!заполнить", new Cmd("!заполнить", "", 28));
    
    case 28:
    setInfo(proc, uin, mmsg);
    break;
    
    public void setInfo(IcqProtocol proc, String uin, String mmsg){
        try {
          int step = 0;
          String cmd = "";
          Vector v = new Vector();
          Users us = srv.us.getUser(uin);
          if (comMap.containsKey(uin)) {
            step = Integer.parseInt(((CommandExtend)comMap.get(uin)).getMsg());
            cmd = ((CommandExtend)comMap.get(uin)).getCmd();
            v = ((CommandExtend)comMap.get(uin)).getData();
          }
          switch (step)
          {
          case 0:
            proc.mq.add(uin, "Анкета: Заполним анкету о себе...\n"
                    + "" + us.localnick + " как тебя зовут?");
            comMap.put(uin, new CommandExtend(uin, mmsg, "1", v, 60000));
            break;
          case 1:
            v.add(0, mmsg);
            proc.mq.add(uin, "Анкета *YES* Ок я понял " + mmsg + ".\n"
                    + "А сколько те лет если не секрет? :-[\n"
                    + "Напиши цифрой пожалуйсто...");
    
            comMap.put(uin, new CommandExtend(uin, cmd, "2", v, 60000));
            break;
          case 2:
            String nn = (String)v.get(0);
            int i;
            try {
              i = Integer.parseInt(mmsg);
            }
            catch (NumberFormatException e)
            {
              proc.mq.add(uin, "Анкета: " + nn + " не так, я же говорю, пожалуйсто напиши цифрой;-)/>");
              comMap.put(uin, new CommandExtend(uin, cmd, "2", v, 120000));
              return;
            }
            v.add(1, mmsg);
            proc.mq.add(uin, "Анкета: ясьненько, идем дальше...\n"
                    + "" + nn + " извини за глупый вопрос..я же бот, я не понимаю \n"
                    + "Напиши свой пол (только: м или ж)");
    
            comMap.put(uin, new CommandExtend(uin, cmd, "3", v, 120000));
            break;
          case 3:
            String nnn = (String)v.get(0);
            String msg = mmsg.toLowerCase();
            if ((msg.equals("м")) || (msg.equals("ж")))
            {
              v.add(2, mmsg);
    
              proc.mq.add(uin, "Анкета: все ясно...\n"
                      + "Так а из какого ты города " + nnn + " ?");
              comMap.put(uin, new CommandExtend(uin, cmd, "4", v, 120000));
            } else {
              proc.mq.add(uin, "Анкета: я же просил м или ж напиши еще раз ;-)/>");
              comMap.put(uin, new CommandExtend(uin, cmd, "3", v, 120000));
            }
            break;
          case 4:
            String nnnn = (String)v.get(0);
            if (!mmsg.trim().equals(" "))
            {
              v.add(3, mmsg);
    
              proc.mq.add(uin, "Анкета: ну и последнее, " + nnnn + " напиши что нибудь о себе...\n"
                      + "Только не долго пиши :-x/> минуты 3 не больше...");
              comMap.put(uin, new CommandExtend(uin, cmd, "5", v, 180000));
            } else {
              proc.mq.add(uin, "Анкета: ты не написал(а) из какого ты города, напиши еще раз ;-)/>");
              comMap.put(uin, new CommandExtend(uin, cmd, "4", v, 120000));
            }
            break;
          case 5:
            if (!mmsg.trim().equals(" ")) {
              v.add(4, mmsg);
              String name = (String)v.get(0);
              String age = (String)v.get(1);
              String half = (String)v.get(2);
              String city = (String)v.get(3);
              String readme = (String)v.get(4);
              String txt = "Ваше имя:" + name;
              txt = txt + "\nВаш возраст:" + age;
              txt = txt + "\nВаш пол:" + half;
              txt = txt + "\nВаш город:" + city;
              txt = txt + "\nО себе:" + readme;
              proc.mq.add(uin, "Анкета: :-)/> Все вроде так:\n"
                      + txt);
              us.fname = name;
              us.gender = Integer.parseInt(age);
              us.lname = half;
              us.city = city;
              us.email = readme;
              srv.us.updateUser(us);
              comMap.remove(uin);
              proc.mq.add(uin,"Анкета: " + name + " твои данные успешно сохранены!\n"
                      + "Посмотреть инфу о себе можеш командой !анкета");
            } else {
              proc.mq.add(uin, "Анкета: Вы не правильно ввели цифру. повторите еще раз. У вас 1 минута.");
              comMap.put(uin, new CommandExtend(uin, cmd, "5", v, 120000));
            }
          }
        }
        catch (Exception ex) {
          ex.printStackTrace();
          proc.mq.add(uin, "Error: " + ex.getMessage());
        }
      }
    А так же нужно добавить 2 колонки
    rs - int
    rsid - string
    Xpert™ нравится это.

Поделиться этой страницей