准备工作:下载Discuz!NT源代码和DiscuzToolkit源代码。
一、修改DiscuzToolkit中的Reply.cs文件,在里面新增加一个类Reply2继承自Reply(目是是增加一个UID字段):
public class Reply2 : Reply { [JsonPropertyAttribute("uid")] public int Uid; }
二、修改DiscuzToolkit中的DiscuzSession.cs文件,添加以下代码:
public TopicReplyResponse TopicReply2(Reply2 reply) { List<DiscuzParam> param_list = new List<DiscuzParam>(); if (session_info != null && !string.IsNullOrEmpty(session_info.SessionKey)) param_list.Add(DiscuzParam.Create("session_key", session_info.SessionKey)); param_list.Add(DiscuzParam.Create("reply_info", JavaScriptConvert.SerializeObject(reply))); TopicReplyResponse trr = util.GetResponse<TopicReplyResponse>("topics.reply2", param_list.ToArray()); return trr; }
三、修改Discuz.Web.Services项目Discuz.Web.Services.API命名空间下的Reply类,添加与第一步相同的代码.
四、修改Discuz.Web.Services项目Discuz.Web.Services.API.Action命名空间下的Topics类,添加下面的代码:
public string Reply2() { if (Signature != GetParam("sig").ToString()) { ErrorCode = (int)ErrorType.API_EC_SIGNATURE; return ""; } //如果是桌面程序则需要验证用户身份 if (this.App.ApplicationType == (int)ApplicationType.DESKTOP){ if (Uid < 1){ ErrorCode = (int)ErrorType.API_EC_SESSIONKEY; return ""; } } if (CallId <= LastCallId){ ErrorCode = (int)ErrorType.API_EC_CALLID; return ""; } if (!CheckRequiredParams("reply_info")){ ErrorCode = (int)ErrorType.API_EC_PARAM; return ""; } Reply2 reply; try{ reply = JavaScriptConvert.DeserializeObject<Reply2>(GetParam("reply_info").ToString()); }catch{ ErrorCode = (int)ErrorType.API_EC_PARAM; return ""; } if (reply == null || AreParamsNullOrZeroOrEmptyString(reply.Tid, reply.Fid, reply.Message)){ ErrorCode = (int)ErrorType.API_EC_PARAM; return ""; } if (reply.Title == null) reply.Title = string.Empty; this.Uid = reply.Uid; #region 主题是否存在,是否已关闭 TopicInfo topicinfo = Discuz.Forum.Topics.GetTopicInfo(reply.Tid); if (topicinfo == null){ ErrorCode = (int)ErrorType.API_EC_PARAM; return ""; } if (topicinfo.Closed == 1){ ErrorCode = (int)ErrorType.API_EC_TOPIC_CLOSED; return ""; } #endregion #region 检测版块是否存在 ForumInfo foruminfo = Discuz.Forum.Forums.GetForumInfo(reply.Fid); if (foruminfo == null){ ErrorCode = (int)ErrorType.API_EC_PARAM; return ""; } #endregion #region 用户组权限 int groupid = 0; ShortUserInfo userinfo = Discuz.Forum.Users.GetShortUserInfo(Uid); if (userinfo == null) groupid = 7; else groupid = userinfo.Groupid; UserGroupInfo usergroupinfo = Discuz.Forum.UserGroups.GetUserGroupInfo(groupid); if (topicinfo.Readperm > usergroupinfo.Readaccess && topicinfo.Posterid != Uid && usergroupinfo.Radminid != 1 && (userinfo != null && !Utils.InArray(userinfo.Username, foruminfo.Moderators.Split(',')))){ ErrorCode = (int)ErrorType.API_EC_TOPIC_READ_PERM; return ""; } #endregion #region 帖子需要密码:不适用于API if (foruminfo.Password != ""){ ErrorCode = (int)ErrorType.API_EC_FORUM_PASSWORD; return ""; } #endregion #region 用户权限 if (!Discuz.Forum.Forums.AllowViewByUserId(foruminfo.Permuserlist, Uid)) //判断当前用户在当前版块浏览权限 { if (foruminfo.Viewperm == null || foruminfo.Viewperm == string.Empty)//当板块权限为空时,按照用户组权限 { if (usergroupinfo.Allowvisit != 1){ ErrorCode = (int)ErrorType.API_EC_FORUM_PERM; return ""; } }else//当板块权限不为空,按照板块权限 { if (!Discuz.Forum.Forums.AllowView(foruminfo.Viewperm, groupid)){ ErrorCode = (int)ErrorType.API_EC_FORUM_PERM; return ""; } } } #endregion //是否有回复的权限 if (!Discuz.Forum.Forums.AllowReplyByUserID(foruminfo.Permuserlist, Uid)) { if (foruminfo.Replyperm == null || foruminfo.Replyperm == string.Empty)//当板块权限为空时根据用户组权限判断 { // 验证用户是否有发表主题的权限 if (usergroupinfo.Allowreply != 1) { ErrorCode = (int)ErrorType.API_EC_REPLY_PERM; return ""; } } else//板块权限不为空时根据板块权限判断 { if (!Discuz.Forum.Forums.AllowReply(foruminfo.Replyperm, groupid)) { ErrorCode = (int)ErrorType.API_EC_REPLY_PERM; return ""; } } } // 如果是受灌水限制用户, 则判断是否是灌水 if (userinfo != null) { string joindate = userinfo.Joindate; if (Utils.StrDateDiffMinutes(joindate, Config.Newbiespan) < 0) { ErrorCode = (int)ErrorType.API_EC_FRESH_USER; return ""; } } if (reply.Title.IndexOf(" ") != -1) { ErrorCode = (int)ErrorType.API_EC_FRESH_USER; return ""; } else if (reply.Title.Length > 60) { ErrorCode = (int)ErrorType.API_EC_FRESH_USER; return ""; } if (reply.Message.Length < Config.Minpostsize) { ErrorCode = (int)ErrorType.API_EC_MESSAGE_LENGTH; return ""; } if (reply.Message.Length > Config.Maxpostsize) { ErrorCode = (int)ErrorType.API_EC_MESSAGE_LENGTH; return ""; } //新用户广告强力屏蔽检查 if ((Config.Disablepostad == 1) && usergroupinfo.Radminid < 1 || userinfo == null) //如果开启新用户广告强力屏蔽检查或是游客 { if (userinfo == null || (Config.Disablepostadpostcount != 0 && userinfo.Posts <= Config.Disablepostadpostcount) || (Config.Disablepostadregminute != 0 && DateTime.Now.AddMinutes(-Config.Disablepostadregminute) <= Convert.ToDateTime(userinfo.Joindate))) { foreach (string regular in Config.Disablepostadregular.Replace("\r", "").Split('\n')) { if (Posts.IsAD(regular, reply.Title, reply.Message)) { ErrorCode = (int)ErrorType.API_EC_SPAM; return ""; } } } } if (ForumUtils.HasBannedWord(reply.Title) || ForumUtils.HasBannedWord(reply.Message)) { ErrorCode = (int)ErrorType.API_EC_SPAM; return ""; } PostInfo postInfo = PostReply(Uid, reply, usergroupinfo, userinfo, foruminfo, topicinfo.Title); if (topicinfo.Replies < (Config.Ppp + 9)) { ForumUtils.DeleteTopicCacheFile(topicinfo.Tid); } TopicReplyResponse trr = new TopicReplyResponse(); trr.PostId = postInfo.Pid; trr.Url = ForumUrl + string.Format("showtopic.aspx?topicid={0}&page=end#{1}", reply.Tid, trr.PostId); trr.NeedAudit = postInfo.Invisible == 1; //同步到其他应用程序 Sync.Reply(postInfo.Pid.ToString(), postInfo.Tid.ToString(), postInfo.Topictitle, postInfo.Poster, postInfo.Posterid.ToString(), postInfo.Fid.ToString(), ApiKey); if (Format == FormatType.JSON) { return JavaScriptConvert.SerializeObject(trr); } return SerializationHelper.Serialize(trr); }
现在,在您自己的项目中重新添加对DiscuzToolkit的引用,就可以使用Reply2回帖并指定用户名了!这样就不会出现Reply回帖显示没有权限的提示了!