'This function adds strings to the keyboard, while not exceeding row_width.
E.g. ReplyKeyboardMarkup#add("A", "B", "C") yields the json result {keyboard: [["A"], ["B"], ["C"]]}
when row_width is set to 1.
When row_width is set to 2, the following is the result of this function: {keyboard: [["A", "B"], ["C"]]}
See https://core.telegram.org/bots/api#replykeyboardmarkup
:param args: KeyboardButton to append to the keyboard'

def add(self, *args):

    i = 1
    row = []
    for button in args:
        if util.is_string(button):
            row.append({'text': button})
        elif isinstance(button, bytes):
            row.append({'text': button.decode('utf-8')})
        else:
            row.append(button.to_dic())
        if ((i % self.row_width) == 0):
            self.keyboard.append(row)
            row = []
        i += 1
    if (len(row) > 0):
        self.keyboard.append(row)
