예제 #1
0
 public LetterResult(char letter, int percent, int totalPixels, int length, int least, LetterResult connected, int optional)
 {
     this.letter      = letter;
     this.percent     = percent;
     this.totalPixels = totalPixels;
     this.length      = length;
     this.least       = least;
     this.connected   = connected;
     this.optional    = optional;
 }
 public LetterResult(Letter letter, int totalPixels, LetterResult connected)
 {
     Letter      = letter;
     TotalPixels = totalPixels;
     Connected   = connected;
 }
        // Checks for a chat letter at the input X and Y value.
        private LetterResult CheckLetter(int x, int y, int[] color)
        {
            // Possible letters
            List <LetterResult> letterresult = new List <LetterResult>();

            // For each letter
            for (int li = 0; li < letters.Length; li++)
            {
                int totalpixels  = 0;
                int successcount = 0;
                int optional     = 0;
                // For each pixel in letter
                for (int pi = 0; pi < letters[li].Pixel.GetLength(0); pi++)
                {
                    int checkX = x + letters[li].Pixel[pi, 0],
                        checkY = y + letters[li].Pixel[pi, 1];

                    if (letters[li].Optional == null || letters[li].Optional.Contains(pi) == false)
                    {
                        totalpixels++;
                        if (Capture.CompareColor(checkX, checkY, color, Chat.ChatFade))
                        {
                            successcount++;
                        }
                    }
                    // Check optional pixels
                    else if (Capture.CompareColor(checkX, checkY, color, Chat.ChatFade))
                    {
                        optional++;
                    }
                }

                // Check for ignore. These are pixels that shouldn't equal the seed.
                if (letters[li].Ignore != null)
                {
                    for (int pi = 0; pi < letters[li].Ignore.GetLength(0); pi++)
                    {
                        int checkX = x + letters[li].Ignore[pi, 0],
                            checkY = y + letters[li].Ignore[pi, 1];
                        if (Capture.CompareColor(checkX, checkY, color, Chat.ChatFade))
                        {
                            totalpixels++;
                        }
                    }
                }

                float result = (float)successcount / totalpixels;

                if (result == 1)
                {
                    LetterResult connected = null;
                    // The letter L can connect to other letters. LM can be confused for U1. This checks for the letter that the L could be connected to.
                    if (letters[li].Char == 'L')
                    {
                        connected = CheckLetter(x + letters[li].Length + 1, y, color);
                    }
                    letterresult.Add(new LetterResult(letters[li], letters[li].Pixel.GetLength(0) + optional, connected)
#if DEBUG
                    {
                        Location = new Point(x, y)
                    }
#endif
                                     ); // Add letter to possible letters.
                }
            }

            LetterResult bestletter = null; // The most likely letter that the letter found is.
            for (int bi = 0; bi < letterresult.Count; bi++)
            {
                if (bestletter == null)
                {
                    bestletter = letterresult[bi];
                }

                // If letterresult[bi]'s pixel count is higher than bestletter's pixel count, make bestletter letterresult[bi]
                // Also, make sure LM/LN/LX/LL/LU isn't confused for something else.
                if (letterresult[bi].TotalPixels > bestletter.TotalPixels)
                {
                    if (bestletter.Connected != null)
                    {
                        // M, N, X, L, U are the letters L can connect to.
                        if ((bestletter.Letter.Char == 'L' && letterresult[bi].Letter.Char == 'U' && TouchingCharacters.Contains(bestletter.Connected.Letter.Char)) == false)
                        {
                            bestletter = letterresult[bi];
                        }
                    }
                    else
                    {
                        bestletter = letterresult[bi];
                    }
                }
            }

            return(bestletter);
        }
예제 #4
0
        // Checks for a chat letter at the input X and Y value.
        LetterResult CheckLetter(Bitmap bmp, int x, int y, int[] seed, int seedfade)
        {
            // Possible letters
            List <LetterResult> letterresult = new List <LetterResult>();

            // For each letter
            for (int li = 0; li < letters.Length; li++)
            {
                int totalpixels  = 0;
                int successcount = 0;
                int optional     = 0;
                // For each pixel in letter
                for (int pi = 0; pi < letters[li].pixel.GetLength(0); pi++)
                {
                    if (letters[li].optional == null || letters[li].optional.Contains(pi) == false)
                    {
                        totalpixels++;
                        // check if not out of bounds of BMP
                        if (x + letters[li].pixel[pi, 0] >= 0 && y + letters[li].pixel[pi, 1] >= 0 && x + letters[li].pixel[pi, 0] < Rectangles.LOBBY_CHATBOX.Width && y + letters[li].pixel[pi, 1] < Rectangles.LOBBY_CHATBOX.Height)
                        {
                            if (bmp.CompareColor(x + letters[li].pixel[pi, 0], y + letters[li].pixel[pi, 1], seed, seedfade))
                            {
                                successcount++;
                            }
                        }
                    }
                    // Check optional pixels
                    else if (x + letters[li].pixel[pi, 0] >= 0 && y + letters[li].pixel[pi, 1] >= 0 && x + letters[li].pixel[pi, 0] < Rectangles.LOBBY_CHATBOX.Width && y + letters[li].pixel[pi, 1] < Rectangles.LOBBY_CHATBOX.Height)
                    {
                        if (bmp.CompareColor(x + letters[li].pixel[pi, 0], y + letters[li].pixel[pi, 1], seed, seedfade))
                        {
                            optional++;
                        }
                    }
                }

                // Check for ignore. These are pixels that shouldn't equal the seed.
                if (letters[li].ignore != null)
                {
                    for (int pi = 0; pi < letters[li].ignore.GetLength(0); pi++)
                    {
                        if (x + letters[li].ignore[pi, 0] > 0 && y + letters[li].ignore[pi, 1] > 0 && x + letters[li].ignore[pi, 0] < Rectangles.LOBBY_CHATBOX.Width && y + letters[li].ignore[pi, 1] < Rectangles.LOBBY_CHATBOX.Height)
                        {
                            if (bmp.CompareColor(x + letters[li].ignore[pi, 0], y + letters[li].ignore[pi, 1], seed, seedfade))
                            {
                                totalpixels++;
                            }
                        }
                    }
                }

                // Get percent.
                double percent = Convert.ToDouble(successcount) / Convert.ToDouble(totalpixels) * 100;

                if (percent == 100)
                {
                    LetterResult connected = null;
                    // The letter L can connect to other letters. LM can be confused for U1. This checks for the letter that the L could be connected to.
                    if (letters[li].letter == 'L')
                    {
                        connected = CheckLetter(bmp, x + letters[li].length + 1, y, seed, seedfade);
                    }
                    letterresult.Add(new LetterResult(letters[li].letter, (int)percent, letters[li].pixel.GetLength(0), letters[li].length, letters[li].least, connected, optional)); // Add letter to possible letters.
                }
            }

            LetterResult bestletter = null; // The most likely letter that the letter found is.

            for (int bi = 0; bi < letterresult.Count; bi++)
            {
                if (bestletter == null)
                {
                    bestletter = letterresult[bi];
                }

                /*
                 * If letterresult[bi]'s pixel count is higher than bestletter's pixel count, make bestletter letterresult[bi]
                 *
                 * Also, make sure LM/LN/LX/LL/LU isn't confused for something else.
                 */
                if (letterresult[bi].totalPixels + letterresult[bi].optional > bestletter.totalPixels + bestletter.optional)
                {
                    if (bestletter.connected != null)
                    {
                        // The letters L can connect to.
                        if ((bestletter.letter == 'L' && letterresult[bi].letter == 'U' && new char[] { 'M', 'N', 'X', 'L', 'U' }.Contains(bestletter.connected.letter)) == false)
                        {
                            bestletter = letterresult[bi];
                        }
                    }
                    else
                    {
                        bestletter = letterresult[bi];
                    }
                }
            }

            // Return the best possible letter.
            if (bestletter != null)
            {
                return(bestletter);
            }
            return(null);
        }
예제 #5
0
        public LetterResult UpdateLetter(LetterDTO message, DR_Requester requester)
        {
            BizTableDrivedEntity bizTableDrivedEntity = new BizTableDrivedEntity();

            if (!bizTableDrivedEntity.DataIsAccessable(requester, message.DataItem.TargetEntityID, new List <SecurityAction>()
            {
                SecurityAction.LetterEdit
            }))
            {
                throw new Exception("عدم دسترسی ثبت نامه");
            }
            LetterResult result        = new LetterResult();
            bool         isNew         = message.ID == 0;
            var          letterSetting = GetLetterSetting();

            if (letterSetting != null)
            {
                if (letterSetting.BeforeLetterSaveCodeID != 0)
                {
                    var resultFunction = codeFunctionHandler.GetCodeFunctionResult(requester, letterSetting.BeforeLetterSaveCodeID, message);
                    if (resultFunction.Exception != null)
                    {
                        var logResult = bizLogManager.AddLog(GetBeforeUpdateExceptionLog(message, resultFunction.Exception, isNew ? DataLogType.LetterInsert : DataLogType.LetterUpdate), requester);
                        if (!string.IsNullOrEmpty(logResult))
                        {
                            ResultDetail logException = new ResultDetail();
                            logException.Title                = "خطای ثبت لاگ";
                            logException.Description          = "خطای لاگ برای اقدام قبل از ثبت نامه";
                            logException.TechnicalDescription = logResult;
                            result.Details.Add(logException);
                        }
                        result.Message = "اقدامات مرتبط قبل از ثبت نامه با خطا همراه بود";
                        return(result);
                    }
                }
            }
            using (var letterModel = new MyIdeaDataDBEntities())
            {
                try
                {
                    var dbLetter = letterModel.Letter.FirstOrDefault(x => x.ID == message.ID);
                    if (dbLetter == null)
                    {
                        dbLetter = new Letter();
                        dbLetter.CreationDate = DateTime.Now;
                        dbLetter.UserID       = requester.Identity;
                        //var dataItemID = bizDataItem.GetOrCreateDataItem(message.DataItem);
                        if (message.DataItem.DataItemID == 0)
                        {
                            dbLetter.MyDataItemID       = bizDataItem.GetOrCreateDataItem(message.DataItem);
                            message.DataItem.DataItemID = dbLetter.MyDataItemID;
                        }
                        else
                        {
                            dbLetter.MyDataItemID = message.DataItem.DataItemID;
                        }
                    }
                    dbLetter.ID                    = message.ID;
                    dbLetter.Desc                  = message.Desc;
                    dbLetter.LetterNumber          = message.LetterNumber;
                    dbLetter.IsGeneratedOrSelected = message.IsGeneratedOrSelected;
                    dbLetter.FromExternalSource    = message.IsExternalOrInternal;
                    dbLetter.ExternalSourceKey     = message.ExternalCode;
                    dbLetter.LetterNumber          = message.LetterNumber;
                    dbLetter.LetterDate            = message.LetterDate;
                    dbLetter.LetterTemplateID      = message.LetterTemplateID == 0 ? (int?)null : message.LetterTemplateID;
                    dbLetter.LetterTypeID          = message.LetterTypeID;
                    dbLetter.RelatedLetterID       = message.RelatedLetterID == 0 ? (int?)null : message.RelatedLetterID;
                    dbLetter.Title                 = message.Title;

                    if (dbLetter.FileRepository == null)
                    {
                        if (message.AttechedFile != null && message.AttechedFile.Content != null)
                        {
                            dbLetter.FileRepository = bizFileRepository.ToFileRepository(letterModel, message.AttechedFile);
                        }
                    }

                    if (dbLetter.ID == 0)
                    {
                        letterModel.Letter.Add(dbLetter);
                    }
                    letterModel.SaveChanges();
                    message.ID     = dbLetter.ID;
                    result.SavedID = dbLetter.ID;
                    result.Result  = true;
                }
                catch (Exception ex)
                {
                    result.Result  = false;
                    result.Message = ex.Message;
                }
                finally
                {
                    var logResult = bizLogManager.AddLog(GetUpdateLetterDataLog(message, result.Message, isNew ? DataLogType.LetterInsert : DataLogType.LetterUpdate), requester);
                    if (!string.IsNullOrEmpty(logResult))
                    {
                        ResultDetail logException = new ResultDetail();
                        logException.Title                = "خطای ثبت لاگ";
                        logException.Description          = "خطای لاگ برای ثبت نامه";
                        logException.TechnicalDescription = logResult;
                        result.Details.Add(logException);
                    }
                }
            }
            if (result.Result == false)
            {
                result.Message = "عملیات ثبت با خطا همراه بود";
                return(result);
            }
            else
            {
                bool afterSaveException = false;
                if (letterSetting != null)
                {
                    if (letterSetting.AfterLetterSaveCodeID != 0)
                    {
                        var resultFunction = codeFunctionHandler.GetCodeFunctionResult(requester, letterSetting.AfterLetterSaveCodeID, message);
                        if (resultFunction.Exception != null)
                        {
                            afterSaveException = true;
                            var logResult = bizLogManager.AddLog(GetAfterUpdateExceptionLog(message, resultFunction.Exception, isNew ? DataLogType.LetterInsert : DataLogType.LetterUpdate), requester);
                            if (!string.IsNullOrEmpty(logResult))
                            {
                                ResultDetail logException = new ResultDetail();
                                logException.Title                = "خطای ثبت لاگ";
                                logException.Description          = "خطای لاگ برای اقدام بعد از ثبت نامه";
                                logException.TechnicalDescription = logResult;
                                result.Details.Add(logException);
                            }
                            return(result);
                        }
                    }
                }
                if (afterSaveException)
                {
                    result.Message = "عملیات ثبت با موفقیت انجام شد اما اقدامات بعد از ثبت با خطا همراه بود";
                }
                else
                {
                    result.Message = "عملیات ثبت با موفقیت انجام شد";
                }

                return(result);
            }
        }