/* * GroupAdd: Add the names in args to the given group name. If the group doesn't * exist, create it. * Return number of names added to group (0 on failure). */ int GroupAdd(char *group_name, char *args) { UserGroup g; int index, i, num_added; char *ptr, *name; Bool add_name; num_added = 0; index = FindGroupByName(group_name); switch(index) { case GROUP_NOMATCH: GameMessage(GetString(hInst, IDS_BADGROUPNAME)); return 0; case GROUP_AMBIGUOUS: GameMessage(GetString(hInst, IDS_DUPLICATEGROUPNAME)); return 0; default: group_name = groups[index]; GroupLoad(group_name, &g); break; } name = GetPlayerName(args, &ptr); while (name != NULL) { if (g.num_users >= MAX_GROUPSIZE) { GameMessagePrintf(GetString(hInst, IDS_GROUPFULL), MAX_GROUPNAME, group_name); break; } // Check for duplicates add_name = True; for (i=0; i < g.num_users; i++) if (!stricmp(g.names[i], name)) { add_name = False; break; } if (add_name) { strncpy(g.names[g.num_users], name, MAX_CHARNAME); g.names[g.num_users][MAX_CHARNAME] = 0; g.num_users++; num_added++; } name = GetPlayerName(ptr, &ptr); } GroupSave(group_name, &g); return num_added; }
/* * GroupDeleteNames: Remove the given names from the given group. * Return number of names deleted, or -1 if the group itself was deleted. */ int GroupDeleteNames(char *group_name, char *args) { int i, j, index, num_deleted; UserGroup g; char *name, *ptr; index = FindGroupByName(group_name); switch(index) { case GROUP_NOMATCH: GameMessage(GetString(hInst, IDS_BADGROUPNAME)); return 0; case GROUP_AMBIGUOUS: GameMessage(GetString(hInst, IDS_DUPLICATEGROUPNAME)); return 0; default: group_name = groups[index]; break; } GroupLoad(group_name, &g); // Remove each name num_deleted = 0; name = GetPlayerName(args, &ptr); while (name != NULL) { for (i=0; i < g.num_users; i++) if (!stricmp(g.names[i], name)) { for (j=i; j < g.num_users - 1; j++) strcpy(g.names[j], g.names[j + 1]); g.num_users--; num_deleted++; break; } name = GetPlayerName(ptr, &ptr); } // XXX Don't delete empty groups (???) #if 0 if (g.num_users == 0) { GroupDelete(group_name); return -1; } #endif GroupSave(group_name, &g); return num_deleted; }
/* * GroupPrint: Display the members of the group with the given name. */ void GroupPrint(char *group_name) { UserGroup g; int i, index; COLORREF color; BYTE style; ID id; char buf[MAX_CHARNAME + 10]; index = FindGroupByName(group_name); switch (index) { case GROUP_NOMATCH: GameMessage(GetString(hInst, IDS_BADGROUPNAME)); break; case GROUP_AMBIGUOUS: GameMessage(GetString(hInst, IDS_DUPLICATEGROUPNAME)); break; default: group_name = groups[index]; GroupLoad(group_name, &g); GameMessagePrintf(GetString(hInst, IDS_GROUPMEMBERS), MAX_GROUPNAME, group_name); color = RGB(0, 0, 0); style = STYLE_NORMAL; EditBoxStartAdd(); for (i=0; i < g.num_users; i++) { if (i != 0) DisplayMessage(", ", color, style); id = FindPlayerByNameExact(g.names[i]); // Show player in red if logged on if (id == 0 || id == INVALID_ID) DisplayMessage(g.names[i], color, style); else { sprintf(buf, "~r%s~n", g.names[i]); DisplayMessage(buf, color, style); } } EditBoxEndAdd(); break; } }
void GroupCommand(HWND hDlg, int ctrl_id, HWND hwndCtl, UINT codeNotify) { int index, i; char group_name[MAX_GROUPNAME + 1], player_name[MAX_CHARNAME + 1], quoted_name[MAX_CHARNAME + 3]; char say_string[MAXSAY + 1]; UserGroup g; HWND hList, hwndFocus, hCombo; Bool legal_index; switch(ctrl_id) { case IDC_GROUPS: if (codeNotify != CBN_SELCHANGE) break; legal_index = GetCurrentGroupName(hDlg, group_name); EnableWindow(GetDlgItem(hDlg, IDC_DELGROUP), legal_index); EnableWindow(GetDlgItem(hDlg, IDC_ADDMEMBER), legal_index); EnableWindow(GetDlgItem(hDlg, IDC_DELMEMBER), legal_index); EnableWindow(GetDlgItem(hDlg, IDC_ADDNAME), legal_index); EnableWindow(GetDlgItem(hDlg, IDC_ADDNAMETEXT), legal_index); if (!legal_index) break; if (GroupLoad(group_name, &g) != GROUP_MATCH) { debug(("GroupCommand unable to load selected group %s\n", group_name)); break; } hList = GetDlgItem(hDlg, IDC_GROUPMEMBERS); ListBox_ResetContent(hList); for (i=0; i < g.num_users; i++) ListBox_AddString(hList, g.names[i]); SetDlgItemText(hDlg, IDC_GROUPSTATUS, ""); break; case IDC_DELGROUP: hCombo = GetDlgItem(hDlg, IDC_GROUPS); index = ComboBox_GetCurSel(hCombo); if (index == CB_ERR) break; ComboBox_GetText(hCombo, group_name, MAX_GROUPNAME); if (GroupDelete(group_name)) { ComboBox_DeleteString(hCombo, index); if (ComboBox_GetCount(hCombo) == 0) { ComboBox_ResetContent(hCombo); ListBox_ResetContent(GetDlgItem(hDlg, IDC_GROUPMEMBERS)); } else ComboBox_SetCurSel(hCombo, min(index, ComboBox_GetCount(hCombo) - 1)); FORWARD_WM_COMMAND(hDlg, IDC_GROUPS, hCombo, CBN_SELCHANGE, GroupDialogProc); if (num_groups < MAX_NUMGROUPS) EnableWindow(GetDlgItem(hDlg, IDC_NEWGROUP), TRUE); SetDlgItemText(hDlg, IDC_GROUPSTATUS, ""); } break; case IDC_ADDMEMBER: if (!GetCurrentGroupName(hDlg, group_name)) break; hList = GetDlgItem(hDlg, IDC_LOGGEDON); index = ListBox_GetCurSel(hList); if (index == LB_ERR) break; ListBox_GetText(hList, index, player_name); // Check for group too full if (ListBox_GetCount(GetDlgItem(hDlg, IDC_GROUPMEMBERS)) >= MAX_GROUPSIZE) { SetDlgItemText(hDlg, IDC_GROUPSTATUS, GetString(hInst, IDS_GROUPFULLDLG)); break; } // Add quotes around player to take care of spaces QuotePlayerName(player_name, quoted_name); if (GroupAdd(group_name, quoted_name) == 0) { SetDlgItemText(hDlg, IDC_GROUPSTATUS, GetString(hInst, IDS_CANTADDNAMEDLG)); break; } hList = GetDlgItem(hDlg, IDC_GROUPMEMBERS); ListBox_AddString(hList, player_name); SetDlgItemText(hDlg, IDC_GROUPSTATUS, ""); break; case IDC_DELMEMBER: if (!GetCurrentGroupName(hDlg, group_name)) break; hList = GetDlgItem(hDlg, IDC_GROUPMEMBERS); index = ListBox_GetCurSel(hList); if (index == LB_ERR) break; ListBox_GetText(hList, index, player_name); QuotePlayerName(player_name, quoted_name); if (GroupDeleteNames(group_name, quoted_name) != 1) { debug(("Deleting name %s from group %s failed\n", player_name, group_name)); break; } ListBox_DeleteString(hList, index); ListBox_SetCurSel(hList, min(index, ListBox_GetCount(hList) - 1)); SetDlgItemText(hDlg, IDC_GROUPSTATUS, ""); break; case IDOK: // Sent when Enter pressed on edit box hwndFocus = GetFocus(); if (hwndFocus == GetDlgItem(hDlg, IDC_ADDNAME)) { if (Edit_GetText(hwndFocus, player_name, MAX_CHARNAME) <= 0) break; Edit_SetSel(hwndFocus, 0, -1); if (!GetCurrentGroupName(hDlg, group_name)) break; // Check for group too full if (ListBox_GetCount(GetDlgItem(hDlg, IDC_GROUPMEMBERS)) >= MAX_GROUPSIZE) { SetDlgItemText(hDlg, IDC_GROUPSTATUS, GetString(hInst, IDS_GROUPFULLDLG)); break; } QuotePlayerName(player_name, quoted_name); if (GroupAdd(group_name, quoted_name) == 0) { SetDlgItemText(hDlg, IDC_GROUPSTATUS, GetString(hInst, IDS_CANTADDNAMEDLG)); break; } hList = GetDlgItem(hDlg, IDC_GROUPMEMBERS); ListBox_AddString(hList, player_name); SetDlgItemText(hDlg, IDC_GROUPSTATUS, ""); } else if (hwndFocus == GetDlgItem(hDlg, IDC_NEWGROUP)) { if (Edit_GetText(hwndFocus, group_name, MAX_GROUPNAME) <= 0) break; Edit_SetSel(hwndFocus, 0, -1); if (!GroupNew(group_name)) { SetDlgItemText(hDlg, IDC_GROUPSTATUS, GetString(hInst, IDS_GROUPFAILEDDLG)); break; } hCombo = GetDlgItem(hDlg, IDC_GROUPS); index = ComboBox_AddString(hCombo, group_name); ComboBox_SetCurSel(hCombo, index); if (num_groups >= MAX_NUMGROUPS) EnableWindow(GetDlgItem(hDlg, IDC_NEWGROUP), FALSE); FORWARD_WM_COMMAND(hDlg, IDC_GROUPS, hCombo, CBN_SELCHANGE, GroupDialogProc); SetDlgItemText(hDlg, IDC_GROUPSTATUS, ""); } else if (hwndFocus == GetDlgItem(hDlg, IDC_GROUPTELL)) { if (Edit_GetText(hwndFocus, say_string, MAXSAY) <= 0) break; if (!GetCurrentGroupName(hDlg, group_name)) break; TellGroup(group_name, say_string); // Prevent auto-repeat from causing lots of messages to be sent Edit_SetText(hwndFocus, ""); } break; case IDC_GROUP_DONE: case IDCANCEL: EndDialog(hDlg, IDOK); break; } }