Implement a function that determines whether a Tic-Tac-Toe game is over.
The input is a 3x3 board represented by a list of lists containing "X", "O", or "." for an empty cell. Return True if either player has three matching symbols in a row, column, or diagonal, or if the board is full; otherwise return False. Assume the board represents a valid game state.
def is_game_over(board):